setattr()和object.__setattr__()有什么区别?
我知道你不能在没有继承自 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
- 等等