根据Python的2.7.12文档:为什么只在新样式类中偏爱object .__ setattr __(self,name,value)?
如果
__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__
方法被调用,但经典的类还可以从基础类继承。那么为什么只推荐新的风格类?
或者,另一方面,为什么不推荐经典课程?
*那么为什么只推荐用于新样式类?*调用'__setattr__'而不是直接在实例字典上操作允许超类对发生的事情进行“监督”。将这种方法看作是新风格类别的优势。它可能会被推荐用于所有类,但不能继承*的旧式类没有可调用'__setattr__'方法的超类。 – jedwards
@jedwards是的,因为经典类没有'classobj .__ setattr__',只有'object .__ setattr__'用于新样式类。 –
你完全正确。我想说的是,我认为你把加粗的那句话,没有这么多来自字典,直接使用实例挫折(如你表明,它工作在很多情况下完全正常,并作为马亭显示,存在这样的情况也不会),但更多的鼓励*使用'__setattr__',这允许超类有些监督和使用诸如描述符之类的新特征。对不起,如果我不清楚:) – jedwards