【发布时间】:2017-12-04 21:04:51
【问题描述】:
在 Python 2.7 中,我可以声明一个新样式的类并使用 object.__setattr__ 设置属性:
class A (object):
def __init__ (self):
object.__setattr__(self, 'foo', 'bar')
A().foo # 'bar'
但是,这在旧式类中不起作用:
class B:
def __init__ (self):
object.__setattr__(self, 'foo', 'bar')
B().foo
TypeError: can't apply this __setattr__ to instance object
我知道旧式类不支持这种行为,但我不知道为什么它不起作用。
当我在一个新式类上调用 object.__setattr__ 而旧式类不能发生时,幕后发生了什么?
请注意,我没有将这段代码用于任何事情,我只是想理解它。
【问题讨论】:
-
object是新式类的基础,所以不,您不能在不是从该基础继承的实例上使用object.__setattr__。 -
@MartijnPieters 我不明白为什么会这样 - 我在这里遗漏了一些关于它是如何工作的东西
-
请注意,我知道只有在非常特殊的情况下才会使用 object.__setattr__ 而不是 setattr。不吝赐教,什么情况下你不想在这里使用
setattr()? -
@MartijnPieters 请参阅this question。您也可以找到examples of this usage in the pandas core。
-
好吧,如果您不从
object继承,那一种情况不适用。例外情况是 MRO 中的中间类被跳过。
标签: python python-2.7 class attributes python-internals