【问题标题】:What's the difference between setattr() and object.__setattr__()?setattr() 和 object.__setattr__() 有什么区别?
【发布时间】:2011-11-25 10:16:15
【问题描述】:

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

【问题讨论】:

  • setattr 是你在另一个对象上调用的东西,__setattr__() 是你在自己的对象上实现的东西。
  • setattr(obj, attr, value) 只是调用obj.__setattr__(attr, value),至少对于新式类。

标签: python setattr


【解决方案1】:

再次阅读此问题时,我误解了@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

【讨论】:

  • 谢谢,这就解释了。该代码可能使用object.__setattr__ 来跳过超类的setattr
  • "setattr(instance, name, value) 是例如语法糖。__setattr__(name, value)" - 真的吗?我隐约记得有些类型没有__getattr__,但无论如何获取属性都对它们有用。这里不一样吗?
  • 对于一个微妙的警告,请参阅我的问题:stackoverflow.com/questions/56144186
  • @Maxpm:您的问题涉及super,仅应按文档使用。
猜你喜欢
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 2018-06-20
  • 2011-08-12
  • 1970-01-01
相关资源
最近更新 更多