我正在尝试动态属性分配以用于测试目的并发现以下行为:
>>> 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
不是?这对我来说似乎有点奇怪,因为派生没有改变任何明显与如何处理变量赋值有关的东西。
答案 0 :(得分:2)
这是因为object
是本机类型,这意味着它是在C代码中实现的,并且出于性能原因不支持动态属性赋值。大多数Python本机类都可以这样说,例如str
或int
。
但Python允许您子类化任何本机类型,并且您的子类确实支持动态分配。
您也可以使用__slots__
特殊属性在课程中出于性能原因禁用它。
答案 1 :(得分:1)
object
个实例没有__dict__
。
>>> hasattr(object(), '__dict__')
False
因此不能添加任何属性。