在Python 中設定物件的屬性:了解限制
在Python 中,可以從物件類本身的實例上。這種差異提出了一個問題:為什麼禁止普通物件分配屬性?
物件實例中缺少字典
為了支援任意屬性分配,物件需要一個 dict 屬性,它充當可以儲存屬性的字典。然而,物件類別的實例並不擁有這樣的 dict__。在 Python 中為每個物件建立 __dict 會帶來巨大的記憶體開銷,因為所有物件都需要存在它,即使是那些不使用屬性的物件。
這可以使用 pympler 進行示範專案。大小測量表明,字典(可以保存屬性的物件)消耗 144 個字節,而整數(沒有屬性的物件)僅需要 16 個位元組。透過引入 __dict__,即使是簡單的物件的記憶體佔用也會大大增加。
繼承與屬性賦值
當建立一個繼承自物件類別的類別時,情況就會改變。 dict 屬性被加入到新類別的每個實例中,允許它具有任意屬性。然而,這種靈活性是有儲存成本的。
例如,建立繼承自 int 的名為 dint 的類別會導致實例佔用 184 位元組,明顯高於常規整數的 16 位元組。這種差異是由於附加的 dict 屬性造成的。
slots 替代方案
在實例只需要對於少量的特定屬性,Python 提供了 slots 特殊屬性。透過將 slots 定義為包含屬性名稱的字串序列,類別可以限制實例可以擁有的屬性集。這種機制可以防止創建 __dict__,從而節省記憶體。
例如,建立一個名為 fint 的類,該類別繼承自 int 並定義一個名為「foobar」的屬性槽,從而將實例的記憶體佔用量減少到 80 位元組。這仍然大於整數,但明顯小於具有 __dict__ 的類別。
結論
總之,Python 中的普通物件無法指派屬性,因為它們不具有 dict 屬性。這樣做主要是為了節省內存,因為每個物件都需要 dict,無論它是否需要屬性。然而,繼承的類別可以透過包含 dict 來擁有屬性,並且 slots 機制在需要有限數量的特定屬性時提供了有效的替代方案。
以上是為什麼不能在 Python 中為普通物件分配屬性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!