如下內容使用Markdown編寫.包括python變量命名規則,特別是私有變量的使用.html
在編寫orm時候,看到一些參考資料上對變量的命名有些特殊,有的前面有一個下劃線,有時會有兩個,非常困惑;本覺得變量的命名只要是前面是下劃線或字母便可,爲了弄清這個問題,產生這個文章 .
這裏能夠[參考資料](4)
一、 _xx 以單下劃線開頭的表示的是protected類型的變量。即保護類型只能容許其自己與子類進行訪問。若內部變量標示,如: 當使用「from M import」時,不會將以一個下劃線開頭的對象引入 。前端
二、 __xx 雙下劃線的表示的是私有類型的變量。只能容許這個類自己進行訪問了,連子類也不能夠用於命名一個類屬性(類變量),調用時名字被改變(在類FooBar內部,__boo變成_FooBar__boo,如self._FooBar__boo)python
三、 __xx__定義的是特列方法。用戶控制的命名空間內的變量或是屬性,如init , __import__或是file 。只有當文檔有說明時使用,不要本身定義這類變量。 (就是說這些是python內部定義的變量名)ssh
在這裏強調說一下私有變量,python默認的成員函數和成員變量都是公開的,沒有像其餘相似語言的public,private等關鍵字修飾.可是能夠在變量前面加上兩個下劃線"_",這樣的話函數或變量就變成私有的.這是python的私有變量軋壓
(這個翻譯好拗口),英文是(private name mangling
.) **狀況就是當變量被標記爲私有後,在變量的前端插入類名,再類名前添加一個下劃線"_",即造成了_ClassName__變量名
.**函數
例子演示post
class A(object): def __init__(self): self.__private() self.public() def __private(self): print 'A.__private()' def public(self): print 'A.public()' class B(A): def __private(self): print 'B.__private()' def public(self): print 'B.public()' a = A() # 實例化對象a b = B() # 實例化對象b print a.__private() # 這裏會報錯,說 AttributeError: 'a' object has no attribute '__private' print b.__private() # 這裏會報錯,說 AttributeError: 'B' object has no attribute '__private' print '======' print b._A__private() # 由於私有變量軋壓機制,__private方法變成_A__private() print dir(b) # 經過自省方法dir(),查看b所具備的屬性 print '======' # ---> A.__private() B.public() ====== A.__private() ====== ['_A__private', '_B__private', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_test', 'get_pri', 'public']
類A和B都有一個私有方法,命名爲_ _private()
,由於B是繼承於A,在用B實例化對象b時,程序須要先執行A的_ _ init_ _ (),執行到_ _ private時, 是A的_ _private();到public()方法時候,B裏面重寫了,所以調用的是B的public()方法;.net
當 執行到print a.__private( )時候,會出現找不到屬性錯誤,本身自己調用私有方法也會出錯,由於私有變量軋壓機制,_ _private
方法變成_A _ _ private()
,因此就找不到這個方法.翻譯
經過執行dir( )方法時候,能夠查看到實例b所具備的屬性,能夠發現多出了`'_A_ _private'`,`'_B__private'`
私有變量/方法在自身類中不能直接調用,這樣的變量用途在哪呢?如下給出一個用途:製做端口,控制變量引用.code
class A(object): def __init__(self): self.__private() self.public() def __private(self): print 'A.__private()' def public(self): print 'A.public()' def get_pri(self): # 獲取私有方法 return self.__private() a= A( ) a.get_pri() #----> A.__private()
以上例子給出一個用途,在類中獲取或設置私有變量,作成端口函數,進行調用,從而引用或修改私有變量.orm
在理解私有變量 時候,其實還須要理解一下_ _init_ _( )
,__new__()
,__call__()
,這三者的執行順序; new 用於建立對象,而 init 是在建立完成以後初始化對象狀態,__call __至關於把這個類型的對象看成函數來使用,至關於重載了括號運算符(可參考這裏).
_ClassName__variableName
;__new__()
--> __init__()
,以後可瞭解單例模式實現[1].__init__()注意事項
http://www.cnblogs.com/zyxstar2003/archive/2011/03/21/1989954.html
[2].理解python命名規則
http://blog.csdn.net/gzlaiyonghao/article/details/1734990
[3].python私有屬性和方法
http://www.cnpythoner.com/post/295.html
[4].python 命名規範
http://www.codesky.net/article/201202/165214.html