在 Python 中,無論是模塊、類還是對象,都擁有一個用于存放名稱與值綁定關系的內部字典——__dict__。它不僅是反射(reflection)機制的核心支點,也體現了 Python 語言“命名即綁定”的動態特性。
要真正理解命名空間的運行邏輯、作用域的生命周期、屬性查找的過程,就必須深入理解 __dict__ 的工作方式。
一、__dict__ 的定義與基本作用
__dict__ 是一個內置屬性,用于保存對象可寫屬性的映射關系。
換言之,它是對象的命名空間存儲容器(namespace storage)。
語法:
object.__dict__類型:
對于普通實例對象(instance)與模塊:類型為 dict
對于類對象:為 mappingproxy(只讀映射視圖)
主要功能:
顯示對象當前的全部屬性及其對應值。
作為反射接口,支持動態增刪改屬性。
反映命名空間的即時狀態。
示例:
# 輸出:{'name': '艾婉婷'}這意味著對象屬性在底層被記錄在一個普通字典中。
二、命名空間與生命周期
Python 中的每個命名空間(namespace)都是一個映射表,它記錄了名稱與對象的綁定關系。這些命名空間的存在與消亡,決定了變量的生命周期(lifecycle)。
(1)命名空間的層級
模塊級命名空間:由模塊的 __dict__ 表示。
類級命名空間:由類的 __dict__(mappingproxy)表示。
實例級命名空間:由實例對象的 __dict__ 表示。
(2)生命周期特征
模塊的 __dict__ 在模塊導入時創建,解釋器退出時銷毀。
類的 __dict__ 在類定義執行完畢時創建,類對象被回收時銷毀。
實例的 __dict__ 在對象構造(__init__ 調用)時生成,__del__ 或引用計數歸零時銷毀。
命名空間的銷毀伴隨字典內容的釋放,字典中引用的對象引用計數隨之減少。
三、類、實例與模塊的 __dict__
(1)模塊的 __dict__
保存模塊中定義的所有變量、函數、類等:
print(math.__dict__.keys()) # 查看 math 模塊命名空間(2)類的 __dict__
保存類屬性與方法定義,但返回值為 mappingproxy,防止直接修改:
print(A.__dict__) #如果想修改類屬性,需通過類對象直接賦值:
A.x = 99(3)實例的 __dict__
僅保存實例自身定義的屬性(而非繼承的):
print(a.__dict__) # {'y': 123}四、動態反射與運行時修改
__dict__ 的一個強大用途是動態反射,它允許我們在運行時讀取、修改對象屬性,而無需提前定義。
print(cfg.version) # 輸出:1.0這種機制在框架(如 Django、Flask)和元編程中非常常見。例如 ORM 模型會根據數據庫字段動態生成類屬性。
注意:
直接修改 __dict__ 雖然可行,但在復雜對象中(如使用 __slots__ 或 C 擴展類型)可能被禁用。
五、__dict__ 與屬性查找機制
對象屬性訪問的底層邏輯可簡化為:
1、優先查找實例 __dict__。
2、若不存在,則向類 __dict__ 查找。
3、若仍未找到,則沿繼承鏈(MRO)繼續上溯。
print(c.x) 查找路徑(邏輯順序):
c.__dict__ → Child.__dict__ → Base.__dict__這種層級式查找正是 Python 動態綁定的基礎。
六、生命周期與內存管理的隱含邏輯
理解 __dict__ 的生命周期,可以更好地掌握 Python 對象的內存行為。
(1)命名綁定與引用計數
每一次名稱綁定都會在 __dict__ 中記錄一條引用。
當名稱解除綁定(del 或命名空間銷毀)時,引用計數減 1。
(2)命名空間銷毀
當命名空間(模塊、類、對象)被釋放時,其 __dict__ 同步銷毀。
若其中的對象仍有外部引用,則其生命周期繼續。
(3)循環引用
若 __dict__ 中對象互相引用,Python 的垃圾回收器(gc 模塊)會檢測并清理。
示例:
gc.collect() # 強制回收循環引用對象七、注意事項與最佳實踐
(1)與其他機制的關系
![]()
(2)不要在普通業務邏輯中頻繁直接操作 __dict__。
(3)若需要動態注入屬性,應使用 setattr() / getattr()。
(4)避免修改類的 __dict__,可通過類定義或裝飾器管理。
(5)若追求性能或內存控制,可考慮 __slots__ 機制。
小結
__dict__ 是 Python 對象體系的核心結構之一,它既是命名空間的載體,也是動態語言反射機制的根基。
通過理解 __dict__,我們就能理解:
命名綁定如何發生。
屬性如何查找。
對象如何隨命名空間生命周期而消亡。
__dict__ 是對象存在的“記憶體”,記錄了 Python 世界中每一個名稱的來龍去脈。理解 __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.