Python 雙下劃線開頭的具體使用
在 Python 中,以兩個下劃線開頭(如 __method)的方法或屬性,并不完全是“私有方法”(private method)——因為 Python 并沒有像 Java 或 C++ 那樣嚴格的訪問控制機制。但這種命名方式會觸發(fā)一種叫做 名稱改寫(name mangling)的機制,從而在一定程度上實現(xiàn)“私有性”。
1. 名稱改寫(Name Mangling)
當你在一個類中定義一個以雙下劃線開頭、且不以雙下劃線結尾的方法或屬性時,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 的方式訪問到這個“私有”成員,但這是一種約定+語言機制,目的是防止子類意外覆蓋父類的內部方法,也提示開發(fā)者“這是內部使用的,不要直接調用”。
2. 與單下劃線的區(qū)別
- 單下劃線開頭(如
_method):只是約定表示“內部使用”,不會觸發(fā)名稱改寫,外部仍可訪問。 - 雙下劃線開頭(如
__method):觸發(fā)名稱改寫,提供更強的封裝暗示。
3. 特殊方法(魔術方法)例外
注意:如果方法名前后都有兩個下劃線(如 __init__, __str__),這是 Python 的特殊方法(也叫魔術方法),不會被名稱改寫,也不表示私有,而是用于實現(xiàn)特定語言特性。
1. 類的特殊方法(魔術方法)
以雙下劃線開頭和結尾的方法,被稱為特殊方法或者魔術方法(Magic Methods)。這些方法由 Python 解釋器自動調用,我們可以通過重寫它們來實現(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))
常用的魔術方法:
__init__:對象初始化__str__和__repr__:字符串表示__len__:長度__add__、__sub__、__mul__:算術運算符__eq__、__lt__、__gt__:比較運算符__iter__和__next__:迭代器協(xié)議__getitem__和__setitem__:索引操作
4.與單下劃線的區(qū)別
- 單下劃線(_method):這是一種約定,表示方法是受保護的(protected),不應該在類外部直接使用。不過 Python 并不會強制限制這種訪問。
- 雙下劃線(__method):會通過名稱修飾機制,讓方法更難以被外部訪問,主要用于避免子類命名沖突。
示例對比:
class Parent:
def _protected(self): # 單下劃線
return "受保護的方法"
def __private(self): # 雙下劃線
return "私有的方法"
class Child(Parent):
pass
c = Child()
print(c._protected()) # 可以正常調用
print(c._Parent__private()) # 可以訪問,但需要使用修飾后的名稱
print(c.__private()) # 報錯:AttributeError
4. 注意事項
- 避免過度使用雙下劃線:除非確實需要防止子類覆蓋方法,否則建議使用單下劃線來表示約定上的私有性。
- 特殊方法和私有方法:不要混淆特殊方法(如
__str__)和私有方法(如__private)。特殊方法是 Python 語言的一部分,而私有方法是類設計的一種選擇。
總結
- Python 沒有真正的“私有方法”。
__method會被名稱改寫,起到模擬私有的作用。- 仍可通過
_ClassName__method訪問,但應避免這樣做。 - 這是一種約定 + 語言機制,用于封裝和避免命名沖突。
到此這篇關于Python 雙下劃線開頭的具體使用的文章就介紹到這了,更多相關Python 雙下劃線開頭內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python使用Matplotlib繪制基礎可視化圖表的完整指南
在Python中進行數(shù)據(jù)可視化,最常用且功能強大的庫是?Matplotlib,它可以幫助你輕松繪制出柱狀圖,折線圖,餅圖,散點圖等,下面小編就和大家詳細介紹一下具體實現(xiàn)方法吧2026-05-05
用Python實現(xiàn)一個簡單的用戶系統(tǒng)
大家好,本篇文章主要講的是用Python實現(xiàn)一個簡單的用戶系統(tǒng),感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01
pytorch 把圖片數(shù)據(jù)轉化成tensor的操作
這篇文章主要介紹了pytorch 把圖片數(shù)據(jù)轉化成tensor的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
Python range函數(shù)之生成器函數(shù)的示例
這篇文章主要介紹了Python range函數(shù)之生成器函數(shù)的示例,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12

