爲什麼它不適用於內置類?python:動態添加屬性到內置類
是使用子類最好的方法來修復它,還是會遇到一些隱藏的問題?
a = {}
a.p = 1 # raises AttributeError
class B(dict):
pass
b = B()
b.p = 1 # works
編輯:我原來的評論,它並沒有爲b
工作是不正確的(我犯了一個錯誤)。
爲什麼它不適用於內置類?python:動態添加屬性到內置類
是使用子類最好的方法來修復它,還是會遇到一些隱藏的問題?
a = {}
a.p = 1 # raises AttributeError
class B(dict):
pass
b = B()
b.p = 1 # works
編輯:我原來的評論,它並沒有爲b
工作是不正確的(我犯了一個錯誤)。
的內置類不必有任意屬性的能力。這是出於性能,尤其是內存使用的原因而完成的,您希望list
和dict
等內置類儘可能小,因此您可以擁有其中的很多類。
因此,內置類沒有任何屬性需要的__dict__
字典才能正常工作。
您可以爲您的課程實現相同。如果它們是用C語言編寫的,則不需要執行__dict__
支持。如果它們是用Python編寫的,則使用slots。
如果您想繼承dict
,您總是可以使用UserDict
(here the documentation)。
而且它與你正在試圖做什麼工作:
from collections import UserDict
a = UserDict()
a.p = 10 # works fine
簡短的懶惰回答:'__slots__'; 'dict'也在C中實現,並且你正在繼承它。 – Daenyth 2012-01-12 22:21:47
你使用的是什麼python版本? b.p = 1在2.7.2和3.2中均有效 – soulcheck 2012-01-12 22:24:45
非常抱歉,它適用於b。更新了問題以反映這一點。 – max 2012-01-12 22:38:57