根据 Python 2.7.12 文档:
如果
__setattr__()
要分配给实例属性,它不应该简单地执行self.name = value
——这将导致对自身的递归调用。相反,它应该在实例属性字典中插入值,例如self.__dict__[name] = value
. 对于新式类,它应该调用具有相同名称的基类方法,而不是访问实例字典,例如,object.__setattr__(self, name, value)
.
但是,以下代码可以按预期工作:
class Class(object):
def __setattr__(self, name, val):
self.__dict__[name] = val;
c = Class()
c.val = 42
print c.val
我知道super(Class, obj).__setattr__(name, value)
可以确保__setattr__
所有基类的方法都被调用,但是经典类也可以从基类继承。那么为什么只推荐用于新风格课程呢?
或者,另一方面,为什么不推荐经典课程这样做?