setattr()和object .__ setattr __()有什么区别?
我知道您不能调用object.__setattr__
未继承自的对象object
,但是两者之间是否还有其他不同之处?如果这很重要,我正在使用Python
2.6。
-
再次阅读这个问题,我误解了@ 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
- 等等
-