Python變量命名規範

模塊名: 
小寫字母,單詞之間用_分割 
ad_stats.py 

包名: 
和模塊名同樣 

類名: 
單詞首字母大寫 
AdStats 
ConfigUtil 

全局變量名(類變量,在java中至關於static變量): 
大寫字母,單詞之間用_分割 
NUMBER 
COLOR_WRITE 

普通變量: 
小寫字母,單詞之間用_分割 
this_is_a_var 

實例變量: 
以_開頭,其餘和普通變量同樣 
_price    
_instance_var 

私有實例變量(外部訪問會報錯): 
以__開頭(2個下劃線),其餘和普通變量同樣 
__private_var 

專有變量: 
__開頭,__結尾,通常爲python的自有變量,不要以這種方式命名 
__doc__ 
__class__ 

普通函數: 
和普通變量同樣: 
get_name() 
count_number() 
ad_stat() 

私有函數(外部訪問會報錯): 
以__開頭(2個下劃線),其餘和普通函數同樣 
__get_name() 
————————————————————————————————————————————————————————————————————
文件名 
全小寫,可以使用下劃線 
包 
應該是簡短的、小寫的名字。若是下劃線能夠改善可讀性能夠加入。如mypackage。 
模塊 
與包的規範同。如mymodule。 
類 
老是使用首字母大寫單詞串。如MyClass。內部類可使用額外的前導下劃線。 

函數&方法 
函數名應該爲小寫,能夠用下劃線風格單詞以增長可讀性。如:myfunction,my_example_function。 
*注意*:混合大小寫僅被容許用於這種風格已經佔據優點的時候,以便保持向後兼容。 
函數和方法的參數 
總使用「self」做爲實例方法的第一個參數。總使用「cls」做爲類方法的第一個參數。 
若是一個函數的參數名稱和保留的關鍵字衝突,一般使用一個後綴下劃線好於使用縮寫或奇怪的拼寫。 
全局變量 
對於from M import *導入語句,若是想阻止導入模塊內的全局變量可使用舊有的規範,在全局變量上加一個前導的下劃線。 
*注意*:應避免使用全局變量 
變量 
變量名所有小寫,由下劃線鏈接各個單詞。如color = WHITE,this_is_a_variable = 1 
*注意*: 
1.不管是類成員變量仍是全局變量,均不使用 m 或 g 前綴。 
2.私有類成員使用單一下劃線前綴標識,多定義公開成員,少定義私有成員。 
3.變量名不該帶有類型信息,由於Python是動態類型語言。如 iValue、names_list、dict_obj 等都是很差的命名。 
常量 
常量名全部字母大寫,由下劃線鏈接各個單詞如MAX_OVERFLOW,TOTAL。 
異常 
以「Error」做爲後綴。 
縮寫 
命名應當儘可能使用全拼寫的單詞,縮寫的狀況有以下兩種: 
1.經常使用的縮寫,如XML、ID等,在命名時也應只大寫首字母,如XmlParser。 
2.命名中含有長單詞,對某個單詞進行縮寫。這時應使用約定成俗的縮寫方式。 
例如: 
function 縮寫爲 fn 
text 縮寫爲 txt 
object 縮寫爲 obj 
count 縮寫爲 cnt 
number 縮寫爲 num,等。 
前導後綴下劃線 
一個前導下劃線:表示非公有。 
一個後綴下劃線:避免關鍵字衝突。 
兩個前導下劃線:當命名一個類屬性引發名稱衝突時使用。 
兩個前導和後綴下劃線:「魔」(有特殊用途)對象或者屬性,例如__init__或者__file__。絕對不要創造這樣的名字,而只是使用它們。 
*注意*:關於下劃線的使用存在一些爭議。 
Python 用下劃線做爲變量前綴和後綴指定特殊變量。 

_xxx      不能用'from module import *'導入 
__xxx__ 系統定義名字 
__xxx    類中的私有變量名 

核心風格:避免用下劃線做爲變量名的開始。 

由於下劃線對解釋器有特殊的意義,並且是內建標識符所使用的符號,咱們建議程序員避免用下劃線做爲變量名的開始。通常來說,變量名_xxx被看做是「私有的」,在模塊或類外不可使用。當變量是私有的時候,用_xxx 來表示變量是很好的習慣。由於變量名__xxx__對Python 來講刑厥夂澹雜諂脹ǖ謀淞坑Φ北苊庹庵置綹瘛?br> 
"單下劃線" 開始的成員變量叫作保護變量,意思是隻有類對象和子類對象本身能訪問到這些變量; 
"雙下劃線" 開始的是私有成員,意思是隻有類對象本身能訪問,連子類對象也不能訪問到這個數據。 

以單下劃線開頭(_foo)的表明不能直接訪問的類屬性,需經過類提供的接口進行訪問,不能用「from xxx import *」而導入;以雙下劃線開頭的(__foo)表明類的私有成員;以雙下劃線開頭和結尾的(__foo__)表明python裏特殊方法專用的標識,如 __init__()表明類的構造函數。 
特定命名方式 
主要是指 __xxx__ 形式的系統保留字命名法。項目中也可使用這種命名,它的意義在於這種形式的變量是隻讀的,這種形式的類成員函數儘可能不要重載。如 
class Base(object): 
def __init__(self, id, parent = None): 
self.__id__ = id 
self.__parent__ = parent 
def __message__(self, msgid): 
# …略 
其中 __id__、__parent__ 和 __message__ 都採用了系統保留字命名法。 
附:Google Python命名規範 
module_name, package_name, ClassName, method_name, ExceptionName, function_name, GLOBAL_VAR_NAME, instance_var_name, function_parameter_name, local_var_name. 
————————————————————————————————————————————————————————
from:http://hi.baidu.com/kxw102/blog/item/212e9f3859202fe33b87ce4b.html 
理解Python命名機制 

引子 
我熱情地邀請你們猜想下面這段程序的輸出: 
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()' 
b = B() 

初探 
正確的答案是: 
A.__private() 
B.public() 
若是您已經猜對了,那麼能夠不看我這篇博文了。若是你沒有猜對或者內心有所疑問,那個人這篇博文正是爲您所準備的。 
一切由爲何會輸出「A.__private()」開始。但要講清楚爲何,咱們就有必要了解一下Python的命名機制。 
據 Python manual,變量名(標識符)是Python的一種原子元素。當變量名被綁定到一個對象的時候,變量名就指代這個對象,就像人類社會同樣,不是嗎?當變 量名出如今代碼塊中,那它就是本地變量;當變量名出如今模塊中,它就是全局變量。模塊相信你們都有很好的理解,但代碼塊可能讓人費解些。在這裏解釋一下: 
代碼塊就是可做爲可執行單元的一段Python程序文本;模塊、函數體和類定義都是代碼塊。不只如此,每個交互腳本命令也是一個代碼塊;一個腳本文件也是一個代碼塊;一個命令行腳本也是一個代碼塊。 
接 下來談談變量的可見性,咱們引入一個範圍的概念。範圍就是變量名在代碼塊的可見性。若是一個代碼塊裏定義本地變量,那範圍就包括這個代碼塊。若是變量定義 在一個功能代碼塊裏,那範圍就擴展到這個功能塊裏的任一代碼塊,除非其中定義了同名的另外一變量。但定義在類中的變量的範圍被限定在類代碼塊,而不會擴展到 方法代碼塊中。 

迷蹤 
據上節的理論,咱們能夠把代碼分爲三個代碼塊:類A的定義、類B的定義和變量b的定義。根據類定義,咱們知道代碼給類A定義了三個成員變量(Python的函數也是對象,因此成員方法稱爲成員變量也行得通。);類B定義了兩個成員變量。這能夠經過如下代碼驗證: 
>>> print '\n'.join(dir(A)) 
_A__private 
__init__ 
public 
>>> print '\n'.join(dir(B)) 
_A__private 
_B__private 
__init__ 
public 
咦,爲何類A有個名爲_A__private的 Attribute 呢?並且__private消失了!這就要談談Python的私有變量軋壓了。 

探究 
懂 Python的朋友都知道Python把以兩個或以上下劃線字符開頭且沒有以兩個或以上下劃線結尾的變量看成私有變量。私有變量會在代碼生成以前被轉換爲 長格式(變爲公有)。轉換機制是這樣的:在變量前端插入類名,再在前端加入一個下劃線字符。這就是所謂的私有變量軋壓(Private name mangling)。如類A裏的__private標識符將被轉換爲_A__private,這就是上一節出現_A__private和 __private消失的緣由了。 
再講兩點題外話: 
一是由於軋壓會使標識符變長,當超過255的時候,Python會切斷,要注意所以引發的命名衝突。 
二是當類名所有如下劃線命名的時候,Python就再也不執行軋壓。如: 
>>> class ____(object): 
       def __init__(self): 
              self.__method() 
       def __method(self): 
              print '____.__method()' 
>>> print '\n'.join(dir(____)) 
__class__ 
__delattr__ 
__dict__ 
__doc__ 
__getattribute__ 
__hash__ 
__init__ 
__method              # 沒被軋壓 
__module__ 
__new__ 
__reduce__ 
__reduce_ex__ 
__repr__ 
__setattr__ 
__str__ 
__weakref__ 
>>> obj = ____() 
____.__method() 
>>> obj.__method()      # 能夠外部調用 
____.__method() 
如今咱們回過頭來看看爲何會輸出「A.__private()」吧! 

真相 
相信如今聰明的讀者已經猜到答案了吧?若是你尚未想到,我給你個提示:真相跟C語言裏的宏預處理差很少。 
由於類A定義了一個私有成員函數(變量),因此在代碼生成以前先執行私有變量軋壓(注意到上一節標紅的那行字沒有?)。軋壓以後,類A的代碼就變成這樣了: 
class A(object): 
       def __init__(self): 
              self._A__private()          # 這行變了 
              self.public() 
       def _A__private(self):           # 這行也變了 
              print 'A.__private()' 
       def public(self): 
              print 'A.public()' 
是否是有點像C語言裏的宏展開啊? 
由於在類B定義的時候沒有覆蓋__init__方法,因此調用的仍然是A.__init__,即執行了self._A__private(),天然輸出「A.__private()」了。 
下面的兩段代碼能夠增長說服力,增進理解: 
>>> class C(A): 
       def __init__(self):          # 重寫__init__,再也不調用self._A__private 
              self.__private()       # 這裏綁定的是_C_private 
              self.public() 
       def __private(self): 
              print 'C.__private()' 
       def public(self): 
              print 'C.public()' 
>>> c = C() 
C.__private() 
C.public() 
############################ 
>>> class A(object): 
       def __init__(self): 
              self._A__private()   # 調用一個沒有定義的函數,Python會把它給個人 ^_^~ 
              self.public() 
       def __private(self): 
              print 'A.__private()' 
       def public(self): 
              print 'A.public()' 
>>>a = A() 
A.__private() 
A.public() html

相關文章
相關標籤/搜索