setattr()和object .__ setattr __()之间有什么区别?

时间:2011-09-26 17:57:33

标签: python setattr

我知道你不能在object.__setattr__未继承的对象上调用object,但两者之间还有什么不同之处吗?我正在使用Python 2.6,如果这很重要的话。

1 个答案:

答案 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__拦截每次查找,即使方法/属性存在

    < / LI>

<强> NB 这两个警告适用于每个语法糖快捷方式:

  • setattr
  • getattr
  • len
  • bool
  • hash