Python 中特殊變量/方法命名規則說明(特別是私有變量)及使用實例

如下內容使用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

相關文章
相關標籤/搜索