2012-01-12 38 views
0

爲什麼它不適用於內置類?python:動態添加屬性到內置類

是使用子類最好的方法來修復它,還是會遇到一些隱藏的問題?

a = {} 
a.p = 1 # raises AttributeError 
class B(dict): 
    pass 
b = B() 
b.p = 1 # works 

編輯:我原來的評論,它並沒有爲b工作是不正確的(我犯了一個錯誤)。

+0

簡短的懶惰回答:'__slots__'; 'dict'也在C中實現,並且你正在繼承它。 – Daenyth 2012-01-12 22:21:47

+3

你使用的是什麼python版本? b.p = 1在2.7.2和3.2中均有效 – soulcheck 2012-01-12 22:24:45

+0

非常抱歉,它適用於b。更新了問題以反映這一點。 – max 2012-01-12 22:38:57

回答

4

的內置類不必有任意屬性的能力。這是出於性能,尤其是內存使用的原因而完成的,您希望listdict等內置類儘可能小,因此您可以擁有其中的很多類。

因此,內置類沒有任何屬性需要的__dict__字典才能正常工作。

您可以爲您的課程實現相同。如果它們是用C語言編寫的,則不需要執行__dict__支持。如果它們是用Python編寫的,則使用slots

0

如果您想繼承dict,您總是可以使用UserDicthere the documentation)。

而且它與你正在試圖做什麼工作:

from collections import UserDict 

a = UserDict() 
a.p = 10 # works fine