我有一棵有成千上萬個節點的大樹,我使用__slots__
來減少內存消耗。我只是發現了一個非常奇怪的錯誤並修復了它,但我不明白我看到的行爲。Python,__slots__,繼承和類變量==>屬性是隻讀錯誤
下面是一個簡單的代碼示例:
class NodeBase(object):
__slots__ = ["name"]
def __init__(self, name):
self.name = name
class NodeTypeA(NodeBase):
name = "Brian"
__slots__ = ["foo"]
我然後執行以下命令:
>>> node = NodeTypeA("Monty")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in __init__
AttributeError: 'NodeTypeA' object attribute 'name' is read-only
有沒有錯誤,如果沒有定義NodeTypeA.name
(邊注:該屬性是有錯,並沒有理由在那裏)。如果NodeTypeA.__slots__
從未定義過,那麼也沒有錯誤,因此它有__dict__
。
我不明白的是:爲什麼超類中的類變量的存在會干擾在子類中的插槽中設置實例變量?
任何人都可以解釋爲什麼這個組合導致object attribute is read-only
錯誤?我知道我的例子是人爲的,在一個真正的程序中不太可能是有意的,但是這並不會使這種行爲變得不那麼奇怪。
謝謝,
喬納森
'NodeTypeA'被創建類變量'name'和不將值分配給在'NodeBase'定義的實例變量。這是故意的嗎? – unholysampler 2011-04-22 17:23:51
起初並不是故意的 - 我在代碼中意外地發現了這個問題,導致了我所問的錯誤。但後來我很好奇爲什麼代碼的行爲就像它一樣,所以我故意將它放在我的代碼示例中。 – Jonathan 2011-04-22 17:52:06