python下劃線開頭函數(shù)總結(jié)示例詳解
在Python中,以雙下劃線 __ 開頭的函數(shù)(或變量)具有特殊的命名含義,主要用于實現(xiàn)類的私有成員、魔法方法(特殊方法)和名稱修飾(Name Mangling)機制。下面詳細解釋這三種情況:
1. 魔法方法(特殊方法)
以雙下劃線開頭并結(jié)尾的方法(如 __init__、__str__)稱為魔法方法(Magic Methods)或特殊方法(Special Methods)。這些方法由Python解釋器自動調(diào)用,用于實現(xiàn)類的內(nèi)置行為。
常見魔法方法示例
class MyClass:
def __init__(self, value): # 構(gòu)造函數(shù),創(chuàng)建對象時自動調(diào)用
self.value = value
def __str__(self): # 對象轉(zhuǎn)字符串時調(diào)用(如print())
return f"MyClass(value={self.value})"
def __add__(self, other): # 定義加法操作(如obj1 + obj2)
return MyClass(self.value + other.value)
def __len__(self): # 定義長度(如len(obj))
return 1調(diào)用示例
a = MyClass(10) b = MyClass(20) print(a + b) # 自動調(diào)用 __add__ 和 __str__ print(len(a)) # 自動調(diào)用 __len__
2. 私有方法和屬性(名稱修飾)
以雙下劃線開頭但不以雙下劃線結(jié)尾的方法(如 __private_method)是類的私有成員,通過名稱修飾(Name Mangling)機制實現(xiàn)一定程度的訪問限制。
名稱修飾規(guī)則
Python會將類中的 __private_method 重命名為 _類名__private_method,使得該方法在類外部難以直接訪問,但并非完全禁止。
示例代碼
class MyClass:
def __public_method(self):
print("這是公開方法")
def __private_method(self):
print("這是私有方法")
def call_private(self):
self.__private_method() # 類內(nèi)部可以正常調(diào)用
obj = MyClass()
obj.__public_method() # 正常調(diào)用
# obj.__private_method() # 報錯:AttributeError
obj._MyClass__private_method() # 可以訪問,但不推薦(違反封裝原則)3. 與單下劃線_的區(qū)別
- 單下劃線
_method:約定俗成的弱私有成員,僅作為開發(fā)者之間的約定,外部仍可訪問。 - 雙下劃線
__method:通過名稱修飾實現(xiàn)的強私有成員,外部訪問需通過_類名__method。
示例對比
class MyClass:
def _single_underscore(self):
print("單下劃線方法")
def __double_underscore(self):
print("雙下劃線方法")
obj = MyClass()
obj._single_underscore() # 可以正常調(diào)用(約定不調(diào)用)
obj._MyClass__double_underscore() # 可以調(diào)用(但破壞封裝)4. 使用場景建議
- 魔法方法:用于實現(xiàn)類的特殊行為,如運算符重載、對象創(chuàng)建和銷毀等。
- 私有方法:用于隱藏類的內(nèi)部實現(xiàn)細節(jié),避免外部直接調(diào)用(但需注意并非絕對安全)。
- 單下劃線:用于模塊級的私有成員(導(dǎo)入時
from module import *不會導(dǎo)入)或內(nèi)部臨時變量。
總結(jié)
| 命名方式 | 含義 | 示例 |
|---|---|---|
__method__ | 魔法方法,Python內(nèi)置行為 | __init__, __add__ |
__method | 私有方法,通過名稱修飾實現(xiàn)封裝 | __private_method |
_method | 弱私有,約定不被外部直接訪問 | _helper_method |
雙下劃線命名是Python實現(xiàn)封裝和特殊行為的重要機制,合理使用可以提高代碼的可讀性和可維護性。
到此這篇關(guān)于python下劃線開頭函數(shù)總結(jié)的文章就介紹到這了,更多相關(guān)python下劃線開頭函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Django Form解決表單數(shù)據(jù)無法動態(tài)刷新的兩種方法
這篇文章主要介紹了使用Django Form解決表單數(shù)據(jù)無法動態(tài)刷新的兩種方法,需要的朋友可以參考下2017-07-07
如何安裝并使用conda指令管理python環(huán)境
這篇文章主要介紹了如何使用conda指令管理python環(huán)境,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07
Pycharm 2to3配置,python2轉(zhuǎn)python3方式
這篇文章主要介紹了Pycharm 2to3配置,python2轉(zhuǎn)python3方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12

