【发布时间】:2013-05-07 18:26:05
【问题描述】:
我正在尝试覆盖 Python 类的 __setattr__ 方法,因为我想在每次实例属性更改其值时调用另一个函数。但是,我不希望在 __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__(...) 并在 __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)
我尝试过self.__dict__['__setitem__'] = self.aux 和object.__setitem__['__setitem__'] = self.aux,但这些尝试都没有效果。看过this section of the data model reference,不过貌似自己的__setattr__赋值有点棘手。
如何在__init__ 的末尾覆盖__setattr__,或者至少有一个pythonic 解决方案,其中__setattr__ 仅在构造函数中以正常方式调用?
【问题讨论】:
标签: python