Python 雙下劃線開頭的具體使用
在 Python 中,以兩個下劃線開頭(如 __method)的方法或?qū)傩裕⒉煌耆?ldquo;私有方法”(private method)——因?yàn)?Python 并沒有像 Java 或 C++ 那樣嚴(yán)格的訪問控制機(jī)制。但這種命名方式會觸發(fā)一種叫做 名稱改寫(name mangling)的機(jī)制,從而在一定程度上實(shí)現(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ù)方法),不會被名稱改寫,也不表示私有,而是用于實(shí)現(xiàn)特定語言特性。
1. 類的特殊方法(魔術(shù)方法)
以雙下劃線開頭和結(jié)尾的方法,被稱為特殊方法或者魔術(shù)方法(Magic Methods)。這些方法由 Python 解釋器自動調(diào)用,我們可以通過重寫它們來實(shí)現(xiàn)特定的類行為。
示例:
class MyClass:
def __init__(self, value): # 實(shí)例初始化方法
self.value = value
def __str__(self): # 定義實(shí)例的字符串表示
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()) # 報(bào)錯:AttributeError
4. 注意事項(xiàng)
- 避免過度使用雙下劃線:除非確實(shí)需要防止子類覆蓋方法,否則建議使用單下劃線來表示約定上的私有性。
- 特殊方法和私有方法:不要混淆特殊方法(如
__str__)和私有方法(如__private)。特殊方法是 Python 語言的一部分,而私有方法是類設(shè)計(jì)的一種選擇。
總結(jié)
- Python 沒有真正的“私有方法”。
__method會被名稱改寫,起到模擬私有的作用。- 仍可通過
_ClassName__method訪問,但應(yīng)避免這樣做。 - 這是一種約定 + 語言機(jī)制,用于封裝和避免命名沖突。
到此這篇關(guān)于Python 雙下劃線開頭的具體使用的文章就介紹到這了,更多相關(guān)Python 雙下劃線開頭內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用Matplotlib繪制基礎(chǔ)可視化圖表的完整指南
在Python中進(jìn)行數(shù)據(jù)可視化,最常用且功能強(qiáng)大的庫是?Matplotlib,它可以幫助你輕松繪制出柱狀圖,折線圖,餅圖,散點(diǎn)圖等,下面小編就和大家詳細(xì)介紹一下具體實(shí)現(xiàn)方法吧2026-05-05
Python實(shí)現(xiàn)Logger打印功能的方法詳解
最近工作中遇到了打印的需求,通過查找相關(guān)的資料發(fā)現(xiàn)Python中Logger可以很好的實(shí)現(xiàn)打印,所以下面這篇文章主要給大家介紹了關(guān)于Python如何實(shí)現(xiàn)Logger打印功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-09-09
基于Python實(shí)現(xiàn)俄羅斯方塊躲閃小游戲
這篇文章主要為大家詳細(xì)介紹了如何基于Python實(shí)現(xiàn)有趣的俄羅斯方塊躲閃小游戲,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-04-04
用Python實(shí)現(xiàn)一個簡單的用戶系統(tǒng)
大家好,本篇文章主要講的是用Python實(shí)現(xiàn)一個簡單的用戶系統(tǒng),感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01
pytorch 把圖片數(shù)據(jù)轉(zhuǎn)化成tensor的操作
這篇文章主要介紹了pytorch 把圖片數(shù)據(jù)轉(zhuǎn)化成tensor的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
理想高通濾波實(shí)現(xiàn)Python opencv示例
今天小編就為大家分享一篇關(guān)于理想高通濾波實(shí)現(xiàn)Python opencv示例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01
Python range函數(shù)之生成器函數(shù)的示例
這篇文章主要介紹了Python range函數(shù)之生成器函數(shù)的示例,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12

