Python中單下劃線和雙下劃線屬性:為什么我能訪問_A卻無法訪問__B?

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)限控制機制(如 publicprivateprotected 等)。雙下劃線的命名修飾,更像是對屬性的一種弱保護,主要目的是避免與子類或其他模塊中的屬性發(fā)生命名沖突,而不是真正的私有屬性。 它依然可以通過特殊手段訪問,因此下劃線僅僅是約定俗成,用于提高代碼的可讀性和可維護性。

以上就是Python中單下劃線和雙下劃線屬性:

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊5 分享