1

我正在尝试动态属性分配以进行测试,并发现了以下行为:

>>> class Foo(object): pass
... 
>>> bar = Spam()
>>> bar.a = 1
>>> spam = object()
>>> spam.a = 2
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'object' object has no attribute 'a'

为什么带有派生类的第一个版本是合法的,但第二个直接使用object不是?这对我来说似乎有点奇怪,因为派生并没有改变任何与变量赋值的处理方式明显有关的东西。

4

2 回答 2

2

这是因为object它是原生类型,这意味着它是在 C 代码中实现的,并且出于性能原因不支持动态属性分配。对于大多数 Python 原生类,例如strint.

但是 Python 允许您对任何本机类型进行子类化,并且您的子类确实支持动态分配。

您也可以出于性能原因在类上禁用它,使用__slots__特殊属性。

于 2013-03-08T23:18:13.053 回答
1

object实例没有__dict__.

>>> hasattr(object(), '__dict__')
False

因此不能向它们添加任何属性。

于 2013-03-08T23:17:37.827 回答