setattr()和object.__setattr__()有什么区别?

20 投票
1 回答
13057 浏览
提问于 2025-04-17 03:07

我知道你不能在没有继承自 object 的对象上调用 object.__setattr__,但除了这个,还有什么其他不同之处吗?我现在在用 Python 2.6,不知道这是否重要。

1 个回答

18

重新读这个问题,我误解了@paper.cut想问的内容:经典类和新式类之间的区别(在Python 3及以上版本中,这个问题不存在)。我不知道这个问题的答案。


原始回答*

setattr(instance, name, value)其实就是instance.__setattr__(name, value)的简化写法**

你只需要在类定义内部调用object.__setattr__(...),而且只有在你直接继承object的时候才需要。如果你是继承其他的类,比如Spam,那么你应该使用super()来获取继承链中的下一个类,或者直接调用Spam.__setattr__(...)。这样做可以避免直接跳过父类而错过它们定义的行为。


*适用于Python 3.0及以上版本的类和2.x的新式类


**有两种情况,setattr(x, ...)x.__setattr__(...)是不一样的:

  • x本身在它的私有字典中有一个__setattr__(所以x.__dict__[__setattr__] = ...(这几乎肯定是个错误)

  • x.__class__有一个__getattribute__方法——因为__getattribute__会拦截每一个查找,即使这个方法或属性是存在的

注意 这两个注意事项适用于所有的简化写法:

  • setattr
  • getattr
  • len
  • bool
  • hash
  • 等等

撰写回答