python 中單下劃線和雙下劃線屬性的訪問機制
在 python 中,我們經常會看到類屬性名前面帶有下劃線,例如 _A 或 __B。很多人認為這僅僅是代碼風格約定,但實際上,雙下劃線(__)會觸發 Python 的命名修飾機制(Name Mangling),這與單下劃線(_)有著本質的區別。
提問者發現,在定義了 _A 和 __B 兩個屬性后,可以直接訪問 _A,卻無法訪問 __B,并收到錯誤提示。這正是 Python 命名修飾機制的結果。
單下劃線 _A 僅僅是一個命名約定,它表示該屬性是“受保護的”,通常暗示其他開發者避免直接訪問它,但實際上并沒有任何機制阻止直接訪問。 它主要用于提醒開發者,這個屬性是內部使用的,修改可能會導致不可預期的后果。
而雙下劃線 __B 則不同。Python 解釋器會對雙下劃線開頭的屬性名進行轉換,這被稱為命名修飾。 轉換后的屬性名通常是 _類名__屬性名 的形式。 例如,在 A 類中,__B 會被轉換為 _A__B。 雖然你依然可以通過 _A__B 直接訪問該屬性,但這并非推薦的做法,因為它繞過了 Python 的命名約定,破壞了代碼的可讀性和可維護性。
立即學習“Python免費學習筆記(深入)”;
因此,我們可以說 Python 的下劃線只是代碼約定,并沒有真正意義上的訪問權限控制機制(如 public、private、protected 等)。雙下劃線的命名修飾,更像是對屬性的一種弱保護,主要目的是避免與子類或其他模塊中的屬性發生命名沖突,而不是真正的私有屬性。 它依然可以通過特殊手段訪問,因此下劃線僅僅是約定俗成,用于提高代碼的可讀性和可維護性。