標籤:

Python 的類的下劃線命名有什麼不同?

1,以一個下劃線開頭的命名 ,如_getFile

2,以兩個下劃線開頭的命名 ,如__filename

3,以兩個下劃線開頭和結尾的命名,如 __init__()

4,其它

這些命名有什麼不同嗎?


首先是單下劃線開頭,這個被常用於模塊中,在一個模塊中以單下劃線開頭的變數和函數被默認當作內部函數,如果使用 from a_module import * 導入時,這部分變數和函數不會被導入。不過值得注意的是,如果使用 import a_module 這樣導入模塊,仍然可以用 a_module._some_var 這樣的形式訪問到這樣的對象。

在 Python 的官方推薦的代碼樣式中,還有一種單下劃線結尾的樣式,這在解析時並沒有特別的含義,但通常用於和 Python 關鍵詞區分開來,比如如果我們需要一個變數叫做 class,但 class 是 Python 的關鍵詞,就可以以單下劃線結尾寫作 class_。

雙下劃線開頭的命名形式在 Python 的類成員中使用表示名字改編 (Name Mangling),即如果有一 Test 類里有一成員 __x,那麼 dir(Test) 時會看到 _Test__x 而非 __x。這是為了避免該成員的名稱與子類中的名稱衝突。但要注意這要求該名稱末尾沒有下劃線。

雙下劃線開頭雙下劃線結尾的是一些 Python 的「魔術」對象,如類成員的 __init__、__del__、__add__、__getitem__ 等,以及全局的 __file__、__name__ 等。 Python 官方推薦永遠不要將這樣的命名方式應用於自己的變數或函數,而是按照文檔說明來使用。

另外單下劃線開頭還有一種一般不會用到的情況在於使用一個 C 編寫的擴展庫有時會用下劃線開頭命名,然後使用一個去掉下劃線的 Python 模塊進行包裝。如 struct 這個模塊實際上是 C 模塊 _struct 的一個 Python 包裝。

更多關於命名的內容可以參考 PEP 8 《代碼風格指南》的 Name Conventions 一節:http://www.python.org/dev/peps/pep-0008/

需要說明的是,由於這份文檔看起來經過多次修改,雙下劃線開頭的用法似乎曾經如 @makestory 所說,建議為類的私有成員,至少啄木鳥社區的 PEP 8 譯文是這樣寫的,但 PEP 8 當前的官方版本中並沒有體現。

啄木鳥的譯文參考:http://wiki.woodpecker.org.cn/moin/PythonCodingRule

另找到一份較新的譯文參考:http://code.google.com/p/zhong-wiki/wiki/PEP8


[sorry 之前的回答有個失誤,私有方法應該是雙下劃線,已更正]

這不是類的命名吧?應該是類方法的。

兩個下劃線開頭的,是一個私有方法命名,但是python的私有方法並不是一個真正的私有方法,因為它還是能夠被外部訪問的,只不過是不能被簡單的直接調用了。

以兩個下劃線開頭和結尾的命名,都是一些特殊的方法,成為一些操作符或某些行為的鉤子(比如 加減乘除、初始化、迭代等)。

單下劃線的我不知道,但是有個常見用法是 _() 用於做 i18n 。比如 _("hello") = &> "你好"


參考我翻譯的一篇譯文:

Python中的下劃線(譯文)


剛剛學會python的類定義,答一波

_xxx 這表示這是一個保護成員(屬性或者方法),它不能用from module import * 導入,其他方面和公有一樣訪問;

__xxx 這表示這是一個私有成員,它無法直接像公有成員一樣隨便訪問(比如直接print阿修改阿),當然,要想訪問也可以,通過對象名._類名__xxx這樣的方式可以訪問;

__xxx__ 這表示這是一個特殊成員,所謂特殊,就是例如__init__() __del__() __call__()這些niubi哄哄的特殊方法

比如——

這麼些年了,你估計早成大牛了,而我剛開始學,算是總結吧,不班門弄斧了,keep learning了


pyton2.7中,模塊中的單下劃線和雙下劃線開頭的成員都是私有成員,不能用from module import *訪問,但是可以用import module訪問


  • object.__format__()這裡邊的下劃線是什麼意思的呢


推薦閱讀:

沒有編程基礎可以直接學習 Python 語言嗎?熟練運用 Python 後能夠做些什麼?
【譯文】2016年度Analytics Vidhya上最火爆的36篇文章和資源
IDLE如何清屏?

TAG:Python |