我知道你不能调用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__
拦截每个查找,即使方法/属性存在
注意 这两个警告适用于每个语法糖快捷方式:
setattr
getattr
len
bool
hash
- ETC
于 2011-09-26T18:10:05.487 回答