变量更改时仅调用一次类函数

问题描述 投票:0回答:0

每次对象中的变量发生更改时,我都会尝试调用函数。如果更改了多个值,我仍然希望在更新所有值后仅调用该函数一次。

我尝试通过覆盖类的

__setattr__
属性来做到这一点,如下所示:

class Test:
    def __init__(self, length: int = 0, data: list = []):
        self.data = data
        self.length = length

    def __setattr__(self, key, value):
        super().__setattr__(key, value)
        print(f"Variable {key} changed to {value}!")
        self.somecoolfunction()

obj = Test(length=5, data=[1, 0, 0, 0, 1, 1])
obj.length, obj.data = 10, [1, 1, 1]

问题是,

somecoolfunction()
在初始化期间被调用两次(对于每个变量),当我更改变量时也被调用两次,导致以下输出:

Variable data changed  to [1, 0, 0, 0, 1, 1]!
Variable length changed  to 5!
Variable length changed  to 10!
Variable data changed  to [1, 1, 1]!

当尚未更改所有变量时,在

somecoolfunction()
中进行所有计算是没有任何意义的。理想情况下,该函数仅在所有更改完成后调用一次。 我当然可以通过引入一个新的
update()
函数来做到这一点:

def update(self, **kwargs):
    for key, value in kwargs.items():
        setattr(self, key, value)
        print(f"Variable {key} changed to {value}!")
    self.somecoolfunction()

但我发现这是违反直觉的。通过这种方式,IDE 不会显示我可以更改哪些变量。许多用户会直接尝试直接分配变量并跳过该函数。你会怎么做呢?谢谢!

python class
© www.soinside.com 2019 - 2024. All rights reserved.