在 Python 的對象模型中,實例的屬性并不是直接存在于對象內部的字段,而是統一存放在一個名為 __dict__ 的映射結構中。
理解實例 __dict__,本質上是在理解實例屬性從何而來、屬性如何被創建、查找與銷毀以及實例命名空間的生命周期與作用邊界。
一、實例 __dict__ 的定義與本質
實例 __dict__ 是一個字典對象,用于存儲實例對象的“實例級屬性”。
type(a.__dict__) #? a.__dict__ 是實例命名空間(Instance Namespace)。
? 鍵是屬性名(字符串),值是對應的屬性值。
每個實例都有自己獨立的 __dict__。因此:
print(a2.__dict__) # {'x': 2}實例之間不會共享 __dict__。
二、實例屬性的創建機制:寫入即綁定
實例屬性并不需要提前聲明。任何對實例屬性的賦值操作,都會直接寫入實例的 __dict__。
a.y = 20等價于:
a.__dict__['y'] = 20這說明,Python 中實例屬性是運行期動態綁定的。實例 __dict__ 是屬性創建的唯一存儲位置(不考慮 時)。
刪除屬性時同理:
del a.__dict__['y']三、實例 __dict__ 在屬性查找中的位置
當訪問 a.attr 時,Python 使用以下固定順序進行查找(簡化版):
1、實例 a.__dict__
2、類 A.__dict__
3、父類的 __dict__(按 MRO 順序)
4、若仍未找到,觸發 __getattr__()
因此,實例 __dict__ 具有非常高的優先級。
示例:
print(A.x) # 100原因是:
a.__dict__ == {'x': 10}實例屬性會遮蔽(shadow)同名類屬性。
四、實例 __dict__ 的生命周期
實例 __dict__ 的生命周期與實例對象完全一致。
1、創建時
a = A()此時:
a.__dict__ == {}實例創建完成后即擁有一個空的 __dict__。
2、使用期間
隨著屬性賦值、修改、刪除,實例 __dict__ 持續變化:
del a.x3、銷毀時
當實例對象被垃圾回收:
del a實例 __dict__ 隨實例一并銷毀,不會留下任何“殘余屬性”。
因此,實例 __dict__ 不具備跨實例、跨生命周期的持久性。
五、實例 __dict__ 與方法、描述符的關系
1、實例方法不存放在實例 __dict__
'a.f' in a.__dict__ # False方法定義在類體內,存放于類 __dict__(此處為 A.__dict__)中,通過描述符機制動態綁定。
2、數據描述符優先級高于實例 __dict__
對于數據描述符(比如 ):
a.x # 42數據描述符優先于實例 __dict__,但非數據描述符優先級要低于實例 __dict__。
六、實例 __dict__ 與 __slots__ 的限制關系
如果類定義了:
a.x = 1此時:
hasattr(a, '__dict__') # False(默認)__slots__ 會移除實例 __dict__,實例屬性改為使用靜態結構存儲,從根本上改變了實例命名空間模型。
若要顯式保留:
__slots__ = ('x', '__dict__')七、常見誤解與澄清
誤解 1:實例屬性存放在類中
? 錯誤
? 正解:實例屬性只存放在實例 __dict__ 中。
誤解 2:實例 __dict__ 與類 __dict__ 是同一個
? 錯誤
? 正解:它們是完全不同的命名空間。
誤解 3:方法屬于實例
? 錯誤
? 正解:方法屬于類,通過描述符機制綁定實例。
誤解 4:刪除實例不會影響類屬性
? 正確
實例 __dict__ 的生命周期與類完全無關。
小結
實例 __dict__ 是實例級命名空間,用于存儲對象在運行期動態綁定的屬性。它以字典形式存在,生命周期與實例一致,在屬性查找順序中通常優先于類 __dict__。實例屬性的賦值、修改與刪除本質上都是對實例 __dict__ 的操作。方法不存放在實例 __dict__ 中,而是定義在類中并通過描述符機制動態綁定。
理解實例 __dict__ 有助于掌握 Python 的屬性模型、命名空間體系與對象生命周期管理。
![]()
“點贊有美意,贊賞是鼓勵”
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.