13

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

4

1 回答 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 回答