动态属性分配

时间:2013-03-08 23:12:16

标签: python dynamic attributes variable-assignment

我正在尝试动态属性分配以用于测试目的并发现以下行为:

>>> 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不是?这对我来说似乎有点奇怪,因为派生没有改变任何明显与如何处理变量赋值有关的东西。

2 个答案:

答案 0 :(得分:2)

这是因为object是本机类型,这意味着它是在C代码中实现的,并且出于性能原因不支持动态属性赋值。大多数Python本机类​​都可以这样说,例如strint

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

您也可以使用__slots__特殊属性在课程中出于性能原因禁用它。

答案 1 :(得分:1)

object个实例没有__dict__

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

因此不能添加任何属性。