我想在设置对象属性时调用一个函数:
class MyClass():
myattrib = None
def __setattr__(self, prop, val):
self.myattrib = val
print("setting myattrib")
x = MyClass()
x.myattrib = "something"
问题是,这会产生无限递归。
想法是在设置成员变量时调用函数(并实际设置该成员变量),但同时运行额外的代码(在 print()
语句中展示上面的例子)。
另一种明显的方法是使用 set_attrib()
函数,这在 Java 中很常见,但我想用 pythonic 的方式来做,并直接设置属性,但同时运行额外的代码。
最佳答案
通过super()
调用基础版本:
class MyClass(object):
myattrib = None
def __setattr__(self, prop, val):
super().__setattr__('myattrib', val)
print("setting myattrib")
您可能不想在这里忽略 prop
参数,它不一定是正在设置的 'myattrib'
。
但是,请考虑使用属性 而不是拦截所有 属性设置:
class MyClass(object):
_myattrib = None
@property:
def myattrib(self):
return self._myattrib
@myattrib.setter
def myattrib(self, val):
self._myattrib = val
print("setting myattrib")
我添加了 object
作为基类;这是 Python 3 中的默认设置,但要求 super()
和 property
对象在 Python 2 中工作。
关于python - 如何在 Python3 中作为类的一部分正确调用 __setattr__()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35011168/