首頁 > 後端開發 > Python教學 > 為什麼不能在 Python 中為普通物件分配屬性?

為什麼不能在 Python 中為普通物件分配屬性?

DDD
發布: 2024-11-14 14:39:01
原創
1032 人瀏覽過

Why can't you assign attributes to vanilla objects in Python?

在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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板