python單下劃線和雙下劃線屬性區(qū)別
在Python類中,單下劃線開頭的屬性( _attr)和雙下劃線開頭的屬性( __attr)主要有以下區(qū)別:
1. 命名規(guī)范與訪問意圖
單下劃線(_attr):
屬于約定俗成的“受保護”屬性,僅作為開發(fā)者之間的約定,提示該屬性不應被外部直接訪問,但Python本身不強制限制訪問。
本質(zhì)上和普通屬性無語法差異,只是一種代碼規(guī)范(PEP 8),用于標識“內(nèi)部使用”的屬性/方法。雙下劃線(__attr):
屬于私有屬性,Python會對其進行名稱改寫(name mangling),以防止子類意外覆蓋或外部直接訪問,是一種語法層面的限制。
2. 名稱改寫機制
雙下劃線屬性:
Python會將__attr自動改寫為_類名__attr(例如,類A中的__x會變成_A__x),外部或子類無法直接通過__attr訪問,需通過改寫后的名稱或類內(nèi)方法訪問。
示例:class A: def __init__(self): self.__x = 10 # 雙下劃線屬性 a = A() print(a.__x) # 報錯:AttributeError print(a._A__x) # 輸出10(可通過改寫后的名稱訪問)單下劃線屬性:
無名稱改寫,外部仍可直接訪問(如a._x),僅靠開發(fā)者自覺遵守“不外部訪問”的約定。
示例:class B: def __init__(self): self._y = 20 # 單下劃線屬性 b = B() print(b._y) # 輸出20(無語法限制)
3. 子類繼承中的表現(xiàn)
單下劃線屬性:
子類可直接繼承并訪問,無語法限制(仍靠約定)。class Parent: def __init__(self): self._x = 10 class Child(Parent): def show(self): print(self._x) # 正常輸出10 c = Child() c.show()雙下劃線屬性:
子類無法直接訪問父類的雙下劃線屬性(因名稱改寫),需通過父類提供的方法訪問。class Parent: def __init__(self): self.__x = 10 def get_x(self): return self.__x class Child(Parent): def show(self): print(self.__x) # 報錯:AttributeError(子類自身無__x) print(self.get_x()) # 輸出10(通過父類方法訪問) c = Child() c.show()
4. 用途總結
單下劃線(_attr):
用于標識“內(nèi)部使用”的屬性/方法,提醒開發(fā)者避免外部直接調(diào)用,適用于模塊內(nèi)或類內(nèi)的私有邏輯,但不強制限制。
常見于模塊級別的“私有”函數(shù)/變量(如import *不會導入單下劃線開頭的對象)。雙下劃線(__attr):
用于真正需要限制訪問的場景(如避免子類覆蓋父類屬性、防止外部篡改),通過名稱改寫實現(xiàn)語法級別的隔離,但并非絕對安全(仍可通過_類名__attr訪問)。
注意
Python中不存在真正的“私有”屬性,雙下劃線的限制可被繞過,其設計目的是避免意外沖突,而非阻止惡意訪問。實際開發(fā)中,單下劃線的約定更常用,雙下劃線慎用(可能增加代碼復雜度)。
到此這篇關于python單下劃線和雙下劃線屬性區(qū)別的文章就介紹到這了,更多相關python單下劃線和雙下劃線區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python實現(xiàn)PDF轉(zhuǎn)Word的方法詳解
由于PDF的文件大多都是只讀文件,有時候為了滿足可以編輯的需要通??梢詫DF文件直接轉(zhuǎn)換成Word文件進行操作。本文為大家整理了一些實現(xiàn)方法,希望對大家有所幫助2023-02-02

