我知道你不能调用object.__setattr__不是继承自的对象object,但是两者之间还有什么不同的吗?如果这很重要,我正在使用 Python 2.6。
8862 次
1 回答
17
再次阅读这个问题,我误解了@paper.cut 所问的:经典类和新型类之间的区别(在 Python 3+ 中不是问题)。我不知道答案。
原始答案*
setattr(instance, name, value)是instance.__setattr__(name, value)**的语法糖。
您只需要object.__setattr__(...)在类定义中调用,然后仅在直接子类化的情况下object——例如,如果你正在对其他东西进行子类化Spam,那么你应该使用super()来获取层次结构中的下一个项目,或者调用Spam.__setattr__(...)——这样你不要冒着丢失超类定义的行为的风险,直接跳过它们到object.
*适用于 Python 3.0+ 类和 2.x 新式类
**有两种情况setattr(x, ...)和x.__setattr__(...)不相同:
x本身__setattr__在它的私人字典中有一个(所以x.__dict__[__setattr__] = ...(这几乎肯定是一个错误)x.__class__有一个__getattribute__方法——因为__getattribute__拦截每个查找,即使方法/属性存在
注意 这两个警告适用于每个语法糖快捷方式:
setattrgetattrlenboolhash- ETC
于 2011-09-26T18:10:05.487 回答