命名規則:
通常使用小寫單詞,必要時用下划線分隔增加可讀性.
使用一個前導下划線僅用於不打算作為類的公共接口的內部方法和實例變量. Python不強制要求這樣; 它取決於程序員是否遵守這個約定. 使用兩個前導下划線以表示類私有的名字. Python將這些名字和類名連接在一起:
如果類Foo有一個屬性名為 __a, 它不能以Foo.__a訪問. (執著的用戶(An insistent user)還是可以通過Foo._Foo__a得到訪問權.) 通常,雙前導下划線應該只用來避免與類(為可以子類化所設計)中的屬性發生名字沖突
我們都知道,Python沒有“私有變量”這樣的說法,如果想訪問,始終是有辦法,但使用雙下划線“__”,可以很大程度上實現“私有”。這里無需多言。
那么單下划線“_“開始的特性呢?很多書里面都沒有說清楚,這里我談談我的看法。如果不對,歡迎各位指正。
直接上簡單代碼:
Python中訪問特性一般使用“訪問器”(SetXXX,GetXXX這類的方法),但是為了看效果,這里使用“實例.變量”的方法訪問。
>>> ap = A() >>> ap.a 'a' >>> ap._a '_a' >>> ap.__a Traceback (most recent call last): File "<stdin>", line 1, in ? AttributeError: A instance has no attribute '__a'
也就是說,真正能起到“私有”作用的,還是“__”。這樣使用雙下划線,又被稱為name-mangling。
那么,單下划線開頭的特性到底有什么用呢?
If you don’t want the name-mangling effect, but you still want to send a signal for other
objects to stay away, you can use a single initial underscore.
----《Beginning Python From Novice to Professional》
因為我個人英文不好,我的理解是這樣:如果你不想使用“__”,但是又想讓其他對象遠離它,那就使用“_”。
總結:
1.帶有單下划線的特性不會被 from module import *導入。
2.單下划線是Python程序員使用類時的約定,表明程序員不希望類的用戶直接訪問屬性。僅僅是一種約定!實際上,實例._變量,可以被訪問。
3、__xxx___ 定義的是特列方法。像__init__之類的
才學Python沒有多久,如果說的不好的,希望各位大神指正。
參考1:http://blog.donews.com/vaneoooo/archive/2006/02/28/746936.aspx
參考2:http://blog.163.com/jackylau_v/blog/static/175754040201182113817834/
ps:參考2個人覺得問題好多。其中以下我表示是不是有問題??
“單下划線” 開始的成員變量叫做保護變量,意思是只有類對象和子類對象自己能訪問到這些變量;
“雙下划線” 開始的是私有成員,意思是只有類對象自己能訪問,連子類對象也不能訪問到這個數據。
-------------------------------------------------------2012.11.13晚割-------------------------------------------------------
在同學指點下,看了PEP 8
_single_leading_underscore: weak "internal use" indicator. E.g. from M import * does not import objects whose name starts with an underscore.
又看了翻譯的PEP 8:http://wiki.woodpecker.org.cn/moin/PythonCodingRule
方法名和實例變量
(Method Names and Instance Variables)
- 這段大體上和函數相同:通常使用小寫單詞,必要時用下划線分隔增加可讀性. 使用一個前導下划線僅用於不打算作為類的公共接口的內部方法和實例變量. Python不強制要求這樣; 它取決於程序員是否遵守這個約定. 使用兩個前導下划線以表示類私有的名字. Python將這些名字和類名連接在一起:
如果類Foo有一個屬性名為 __a, 它不能以Foo.__a訪問. (執著的用戶(An insistent user)還是可以通過Foo._Foo__a得到訪問權.) 通常,雙前導下划線應該只用來避免與類(為可以子類化所設計)中的屬性發生名字沖突.
