Python 雙下劃線開頭的具體使用
在 Python 中,以兩個下劃線開頭(如 __method)的方法或?qū)傩?,并不完全?ldquo;私有方法”(private method)——因為 Python 并沒有像 Java 或 C++ 那樣嚴(yán)格的訪問控制機(jī)制。但這種命名方式會觸發(fā)一種叫做 名稱改寫(name mangling)的機(jī)制,從而在一定程度上實現(xiàn)“私有性”。
1. 名稱改寫(Name Mangling)
當(dāng)你在一個類中定義一個以雙下劃線開頭、且不以雙下劃線結(jié)尾的方法或?qū)傩詴r,Python 解釋器會自動將其名稱改寫為:
_ClassName__original_name
例如:
class MyClass:
def __init__(self):
self.__private_var = 42
def __private_method(self):
return "This is private"
obj = MyClass()
# obj.__private_method() # AttributeError!
print(obj._MyClass__private_method()) # 可以訪問,但不推薦
雖然你仍然可以通過 _ClassName__name 的方式訪問到這個“私有”成員,但這是一種約定+語言機(jī)制,目的是防止子類意外覆蓋父類的內(nèi)部方法,也提示開發(fā)者“這是內(nèi)部使用的,不要直接調(diào)用”。
2. 與單下劃線的區(qū)別
- 單下劃線開頭(如
_method):只是約定表示“內(nèi)部使用”,不會觸發(fā)名稱改寫,外部仍可訪問。 - 雙下劃線開頭(如
__method):觸發(fā)名稱改寫,提供更強(qiáng)的封裝暗示。
3. 特殊方法(魔術(shù)方法)例外
注意:如果方法名前后都有兩個下劃線(如 __init__, __str__),這是 Python 的特殊方法(也叫魔術(shù)方法),不會被名稱改寫,也不表示私有,而是用于實現(xiàn)特定語言特性。
1. 類的特殊方法(魔術(shù)方法)
以雙下劃線開頭和結(jié)尾的方法,被稱為特殊方法或者魔術(shù)方法(Magic Methods)。這些方法由 Python 解釋器自動調(diào)用,我們可以通過重寫它們來實現(xiàn)特定的類行為。
示例:
class MyClass:
def __init__(self, value): # 實例初始化方法
self.value = value
def __str__(self): # 定義實例的字符串表示
return f"MyClass(value={self.value})"
def __add__(self, other): # 定義加法操作
return MyClass(self.value + other.value)
def __len__(self): # 定義長度
return len(str(self.value))
常用的魔術(shù)方法:
__init__:對象初始化__str__和__repr__:字符串表示__len__:長度__add__、__sub__、__mul__:算術(shù)運(yùn)算符__eq__、__lt__、__gt__:比較運(yùn)算符__iter__和__next__:迭代器協(xié)議__getitem__和__setitem__:索引操作
4.與單下劃線的區(qū)別
- 單下劃線(_method):這是一種約定,表示方法是受保護(hù)的(protected),不應(yīng)該在類外部直接使用。不過 Python 并不會強(qiáng)制限制這種訪問。
- 雙下劃線(__method):會通過名稱修飾機(jī)制,讓方法更難以被外部訪問,主要用于避免子類命名沖突。
示例對比:
class Parent:
def _protected(self): # 單下劃線
return "受保護(hù)的方法"
def __private(self): # 雙下劃線
return "私有的方法"
class Child(Parent):
pass
c = Child()
print(c._protected()) # 可以正常調(diào)用
print(c._Parent__private()) # 可以訪問,但需要使用修飾后的名稱
print(c.__private()) # 報錯:AttributeError
4. 注意事項
- 避免過度使用雙下劃線:除非確實需要防止子類覆蓋方法,否則建議使用單下劃線來表示約定上的私有性。
- 特殊方法和私有方法:不要混淆特殊方法(如
__str__)和私有方法(如__private)。特殊方法是 Python 語言的一部分,而私有方法是類設(shè)計的一種選擇。
總結(jié)
- Python 沒有真正的“私有方法”。
__method會被名稱改寫,起到模擬私有的作用。- 仍可通過
_ClassName__method訪問,但應(yīng)避免這樣做。 - 這是一種約定 + 語言機(jī)制,用于封裝和避免命名沖突。
到此這篇關(guān)于Python 雙下劃線開頭的具體使用的文章就介紹到這了,更多相關(guān)Python 雙下劃線開頭內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python分塊讀取大數(shù)據(jù),避免內(nèi)存不足的方法
今天小編就為大家分享一篇python分塊讀取大數(shù)據(jù),避免內(nèi)存不足的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12
數(shù)組保存為txt, npy, csv 文件, 數(shù)組遍歷enumerate的方法
今天小編就為大家分享一篇數(shù)組保存為txt, npy, csv 文件, 數(shù)組遍歷enumerate的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07
Python偏函數(shù)Partial function使用方法實例詳解
這篇文章主要介紹了Python偏函數(shù)Partial function使用方法實例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06
Python面向?qū)ο箢惥帉懠?xì)節(jié)分析【類,方法,繼承,超類,接口等】
這篇文章主要介紹了Python面向?qū)ο箢惥帉懠?xì)節(jié),較為詳細(xì)的分析了Python面向?qū)ο蟪绦蛟O(shè)計中類,方法,繼承,超類,接口等相關(guān)概念、使用技巧與注意事項,需要的朋友可以參考下2019-01-01
python中關(guān)于range()函數(shù)反向遍歷的幾種表達(dá)
這篇文章主要介紹了python中關(guān)于range()函數(shù)反向遍歷的幾種表達(dá),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05
python實現(xiàn)bitmap數(shù)據(jù)結(jié)構(gòu)詳解
bitmap是很常用的數(shù)據(jù)結(jié)構(gòu),比如用于Bloom Filter中,下面是使用python實現(xiàn)bitmap數(shù)據(jù)結(jié)構(gòu)的代碼講解,需要的朋友可以參考下2014-02-02
windows下安裝Python的XlsxWriter模塊方法
今天小編就為大家分享一篇windows下安裝Python的XlsxWriter模塊方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05

