我试图覆盖__setattr__
Python 类的方法,因为我想在每次实例属性更改其值时调用另一个函数。但是,我不希望在__init__
方法中出现这种行为,因为在此初始化期间,我设置了一些稍后将使用的属性:
到目前为止,我有这个解决方案,__setattr__
在运行时没有覆盖:
class Foo(object):
def __init__(self, a, host):
object.__setattr__(self, 'a', a)
object.__setattr__(self, 'b', b)
result = self.process(a)
for key, value in result.items():
object.__setattr__(self, key, value)
def __setattr__(self, name, value):
print(self.b) # Call to a function using self.b
object.__setattr__(self, name, value)
但是,我想避免这些并在方法结束时object.__setattr__(...)
覆盖:__setattr__
__init__
class Foo(object):
def __init__(self, a, b):
self.a = a
self.b = b
result = self.process(a)
for key, value in result.items():
setattr(self, key, value)
# override self.__setattr__ here
def aux(self, name, value):
print(self.b)
object.__setattr__(self, name, value)
我试过self.__dict__['__setitem__'] = self.aux
and object.__setitem__['__setitem__'] = self.aux
,但这些尝试都没有效果。我已经阅读了数据模型参考的这一部分,但是看起来自己的赋值__setattr__
有点棘手。
怎么可能__setattr__
在结尾处覆盖__init__
,或者至少有一个 pythonic 解决方案,其中__setattr__
仅在构造函数中以正常方式调用?