每次对象中的变量发生更改时,我都会尝试调用函数。如果更改了多个值,我仍然希望在更新所有值后仅调用该函数一次。
我尝试通过覆盖类的
__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 不会显示我可以更改哪些变量。许多用户会直接尝试直接分配变量并跳过该函数。你会怎么做呢?谢谢!