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
參考我翻譯的一篇譯文:
Python中的底線(譯文)
[sorry 之前的回答有個失誤,私人方法應該是雙底線,已更正]
這不是類的命名吧?應該是類方法的。
兩個底線開頭的,是一個私人方法命名,但是python的私人方法並不是一個真正的私人方法,因為它還是能夠被外部存取的,只不過是不能被簡單的直接調用了。
以兩個底線開頭和結尾的命名,都是一些特殊的方法,成為一些操作符或某些行為的鉤子(比如 加減乘除、初始化、迭代等)。
單底線的我不知道,但是有個常見用法是 _() 用於做 i18n 。比如 _('hello') = > '你好' pyton2.7中,模組中的單底線和雙底線開頭的成員都是私人成員,不能用from module import *訪問,但是可以用import module訪問