Python中的單下劃線(xiàn)和雙下劃線(xiàn)使用場(chǎng)景詳解
單下劃線(xiàn)
單下劃線(xiàn)用作變量
最常見(jiàn)的一種使用場(chǎng)景是作為變量占位符,使用場(chǎng)景明顯可以減少代碼中多余變量的使用。為了方便理解,_
可以看作被丟棄的變量名稱(chēng),這樣做可以讓閱讀你代碼的人知道,這是個(gè)不會(huì)被使用的變量,e.g.。
for _, _, filenames in os.walk(targetDir): print(filenames) for _ in range(100): print('PythonPoint')
在交互解釋器比如iPython中,_
變量指向交互解釋器中最后一次執(zhí)行語(yǔ)句的返回結(jié)果。
單下劃線(xiàn)前綴名稱(chēng)(例如_pythonPoint)
- 這表示這是一個(gè)保護(hù)成員(屬性或者方法),只有類(lèi)對(duì)象和子類(lèi)對(duì)象自己能訪(fǎng)問(wèn)到這些變量,是用來(lái)指定私有變量和方法的一種方式(約定而已)。如果使用
from a_module import *
導(dǎo)入時(shí),這部分變量和函數(shù)不會(huì)被導(dǎo)入。不過(guò)值得注意的是,如果使用import a_module
這樣導(dǎo)入模塊,仍然可以用a_module._pythonPoint
這樣的形式訪(fǎng)問(wèn)到這樣的對(duì)象。 - 另外單下劃線(xiàn)開(kāi)頭還有一種一般不會(huì)用到的情況,例如使用一個(gè)C編寫(xiě)的擴(kuò)展庫(kù)有時(shí)會(huì)用下劃線(xiàn)開(kāi)頭命名,然后使用一個(gè)去掉下劃線(xiàn)的Python模塊進(jìn)行包裝。如struct這個(gè)模塊實(shí)際上是C模塊
_struct
的一個(gè)Python包裝。
單下劃線(xiàn)后綴名稱(chēng)
通常用于和Python關(guān)鍵詞區(qū)分開(kāi)來(lái),比如我們需要一個(gè)變量叫做class,但class是Python的關(guān)鍵詞,就可以以單下劃線(xiàn)結(jié)尾寫(xiě)作class_
。
雙下劃線(xiàn)
雙下劃線(xiàn)前綴名稱(chēng)
這表示這是一個(gè)私有成員(屬性或者方法)。它無(wú)法直接像公有成員一樣隨便訪(fǎng)問(wèn)。雙下劃線(xiàn)開(kāi)頭的命名形式在Python的類(lèi)成員中使用表示名字改編,即如果Test類(lèi)里有一成員__x
,那么dir(Test)
時(shí)會(huì)看到_Test__x
而非__x
。這是為了避免該成員的名稱(chēng)與子類(lèi)中的名稱(chēng)沖突,方便父類(lèi)和子類(lèi)中該成員的區(qū)分識(shí)別。但要注意這要求該名稱(chēng)末尾最多有一個(gè)下劃線(xiàn)。e.g.
雙下劃線(xiàn)前綴及后綴名稱(chēng)
一種約定,Python內(nèi)部的名字,用來(lái)區(qū)別其他用戶(hù)自定義的命名,以防沖突。是一些Python的“魔術(shù)”對(duì)象,表示這是一個(gè)特殊成員。如類(lèi)成員的__init__
、__del__
、__add__
等,以及全局的__file__
、__name__
等。Python官方推薦永遠(yuǎn)不要將這樣的命名方式應(yīng)用于自己的變量或函數(shù),而是按照文檔說(shuō)明來(lái)使用Python內(nèi)置的這些特殊成員。
Python中關(guān)于私有屬性、方法約定問(wèn)題,官方文檔如下
“Private” instance variables that cannot be accessed except from inside an object don't exist in Python. However, there is a convention that is followed by most Python code: a name prefixed with an underscore (e.g. _spam) should be treated as a non-public part of the API (whether it is a function, a method or a data member). It should be considered an implementation detail and subject to change without notice.Since there is a valid use-case for class-private members (namely to avoid name clashes of names with names defined by subclasses), there is limited support for such a mechanism, called name mangling. Any identifier of the form__spam (at least two leading underscores, at most one trailing underscore) is textually replaced with _classname__spam, where classname is the current class name with leading underscore(s) stripped. This mangling is done without regard to the syntactic position of the identifier, as long as it occurs within the definition of a class.
Name mangling is helpful for letting subclasses override methods without breaking intraclass method calls.
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python使用sklearn庫(kù)實(shí)現(xiàn)的各種分類(lèi)算法簡(jiǎn)單應(yīng)用小結(jié)
這篇文章主要介紹了Python使用sklearn庫(kù)實(shí)現(xiàn)的各種分類(lèi)算法,結(jié)合實(shí)例形式分析了Python使用sklearn庫(kù)實(shí)現(xiàn)的KNN、SVM、LR、決策樹(shù)、隨機(jī)森林等算法實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-07-07一行代碼解決動(dòng)態(tài)執(zhí)行Python函數(shù)方法實(shí)例
這篇文章主要為大家介紹了如何用一行代碼解決動(dòng)態(tài)執(zhí)行Python函數(shù)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Python3實(shí)現(xiàn)統(tǒng)計(jì)單詞表中每個(gè)字母出現(xiàn)頻率的方法示例
這篇文章主要介紹了Python3實(shí)現(xiàn)統(tǒng)計(jì)單詞表中每個(gè)字母出現(xiàn)頻率的方法,涉及Python針對(duì)文件的讀取、遍歷、統(tǒng)計(jì)等相關(guān)操作技巧,需要的朋友可以參考下2019-01-01Python?multiprocessing?共享對(duì)象的示例代碼
在 Python 中使用 multiprocessing,一個(gè)新的進(jìn)程可以獨(dú)立運(yùn)行并擁有自己的內(nèi)存空間,下面通過(guò)示例代碼講解Python multiprocessing共享對(duì)象的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧2023-07-07Python3.7實(shí)現(xiàn)驗(yàn)證碼登錄方式代碼實(shí)例
這篇文章主要介紹了Python3.7實(shí)現(xiàn)驗(yàn)證碼登錄方式代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02