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