2013-03-08 100 views
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不是第二直接使用?這似乎有點奇怪,因爲派生並沒有改變任何與變量賦值如何處理顯然有關的事情。

+0

此問題可能有所幫助:http://stackoverflow.com/q/1285269/1015178 – 2013-03-08 23:17:50

+0

同意。我沒有仔細檢查一個存在的問題。 – phineas 2013-03-08 23:22:37

回答

2

這是因爲object是本機類型,這意味着它是用C代碼實現的,並且由於性能原因不支持動態屬性分配。對於大多數Python本地類也是如此,例如strint

但是Python允許您繼承任何本機類型,並且您的子類支持動態分配。

您也可以通過使用__slots__特殊屬性來出於性能原因禁用它。

1

object實例沒有__dict__

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

因此不能添加任何屬性。