我知道你不能在object.__setattr__
未继承的对象上调用object
,但两者之间还有什么不同之处吗?我正在使用Python 2.6,如果这很重要的话。
答案 0 :(得分:14)
再次阅读这个问题我误解了@ 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__
拦截每次查找,即使方法/属性存在
<强> NB 强> 这两个警告适用于每个语法糖快捷方式:
setattr
getattr
len
bool
hash