我想覆盖Python类的__setattr__
方法,因为每次实例属性更改其值时都要调用另一个函数。不过,我不希望在__init__
方法这种行为,因为这在初始化过程中我设置一些属性,其将要在以后使用:到目前为止,我有这个解决方案在运行时覆盖__setattr__
,而无需在运行覆盖__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__(...)
并在__init__
方法结束时覆盖__setattr__
:
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)
我与试图和object.__setitem__['__setitem__'] = self.aux
,但这些尝试都没有效果。我已阅读this section of the data model reference,但它看起来像自己__setattr__
的任务有点棘手。
怎么可能在__init__
的末尾覆盖__setattr__
,或者至少有一个pythonic解决方案,其中__setattr__
只在构造函数中以正常方式调用?
哇!哇哇!我偶然发现了这一点,几乎将它解雇了,但事实证明,这正是我需要解决类似问题的方法。这个答案中有一些严重的Python魔法。对不起,我无法注册100次:p – velis 2014-08-07 08:09:46