為什麼我無法在 Python 中修改 Vanilla 物件實例的屬性?

Susan Sarandon
發布: 2024-11-11 10:27:03
原創
844 人瀏覽過

Why Can't I Modify Attributes of a Vanilla Object Instance in Python?

無法修改「object」實例的屬性

嘗試將屬性指派給普通物件實例(如o.attr = 'hello')時,會引發AttributeError ,表示該物件缺少指定的屬性。但是,對於從 object 繼承的類別(例如 Sub)來說,這不是問題,它可以分配 s.attr = 'hello' 等屬性。為什麼會這樣,需要了解Python的內部基礎架構。

Python的屬性賦值機制

為了支援動態屬性賦值,物件必須有一個 __dict__ ,它作為一個字典,可以儲存任意屬性可以儲存。如果沒有 __dict__,就沒有可用於新屬性的儲存。

物件的實例沒有 __dict__。在物件定義中包含一個會導致循環相依性問題,因為 dict 也是從 object 繼承的。此外,為每個物件分配 __dict__ 會為不需要動態屬性分配的物件帶來不必要的記憶體開銷。

類別實例和動態屬性分配

建立繼承自 object 的類別時,情況會改變。類別實例的建立會觸發 __dict__ 的分配。這允許物件的子類別擁有動態屬性分配功能,但會增加與靈活性相關的記憶體成本。

最佳化屬性分配:插槽

Python 提供了一種最佳化__slots__ 技術,用於限制可以指派給物件的屬性。透過在 __slots__ 屬性中指定字串名稱序列,該類別指示 Python 不要建立 __dict__ 而是僅指派指定的屬性槽。這種方法減少了記憶體開銷,並且在物件具有一組固定屬性的情況下非常有用。

總而言之,無法為物件實例分配屬性源自於缺少 __dict__,這會引入記憶體開銷對於沒有動態屬性分配功能的物件。然而,類別實例擁有 __dict__ 並且可以動態分配屬性。 __slots__ 屬性透過將屬性分配限制為固定集來提供記憶體最佳化選項。

以上是為什麼我無法在 Python 中修改 Vanilla 物件實例的屬性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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