出自:http://www.diybl.com/course/3_program/python/20111130/563643.html
模塊名:
小寫字母,單詞之間用_分割
ad_stats.py
包名:
和模塊名一樣
類名:
單詞首字母大寫
AdStats
ConfigUtil
全局變量名(類變量,在java中相當(dāng)于static變量):
大寫字母毛嫉,單詞之間用_分割
NUMBER
COLOR_WRITE
普通變量:
小寫字母彼哼,單詞之間用_分割
this_is_a_var
實例變量:
以_開頭奕短,其他和普通變量一樣
_price
_instance_var
私有實例變量(外部訪問會報錯):
以__開頭(2個下劃線)嚎货,其他和普通變量一樣
__private_var
專有變量:
開頭举农,結(jié)尾瀑焦,一般為python的自有變量腌且,不要以這種方式命名
doc
class
普通函數(shù):
和普通變量一樣:
get_name()
count_number()
ad_stat()
私有函數(shù)(外部訪問會報錯):
以__開頭(2個下劃線),其他和普通函數(shù)一樣
__get_name()
————————————————————————————————————————————————————————————————————
文件名
全小寫,可使用下劃線
包
應(yīng)該是簡短的榛瓮、小寫的名字铺董。如果下劃線可以改善可讀性可以加入。如mypackage。
模塊
與包的規(guī)范同精续。如mymodule坝锰。
類
總是使用首字母大寫單詞串。如MyClass重付。內(nèi)部類可以使用額外的前導(dǎo)下劃線顷级。
函數(shù)&方法
函數(shù)名應(yīng)該為小寫,可以用下劃線風(fēng)格單詞以增加可讀性确垫。如:myfunction弓颈,my_example_function。
注意:混合大小寫僅被允許用于這種風(fēng)格已經(jīng)占據(jù)優(yōu)勢的時候删掀,以便保持向后兼容翔冀。
函數(shù)和方法的參數(shù)
總使用“self”作為實例方法的第一個參數(shù)∨幔總使用“cls”作為類方法的第一個參數(shù)橘蜜。
如果一個函數(shù)的參數(shù)名稱和保留的關(guān)鍵字沖突,通常使用一個后綴下劃線好于使用縮寫或奇怪的拼寫付呕。
全局變量
對于from M import *導(dǎo)入語句计福,如果想阻止導(dǎo)入模塊內(nèi)的全局變量可以使用舊有的規(guī)范,在全局變量上加一個前導(dǎo)的下劃線徽职。
注意:應(yīng)避免使用全局變量
變量
變量名全部小寫象颖,由下劃線連接各個單詞。如color = WHITE姆钉,this_is_a_variable = 1
注意:
1.不論是類成員變量還是全局變量说订,均不使用 m 或 g 前綴。
2.私有類成員使用單一下劃線前綴標(biāo)識潮瓶,多定義公開成員陶冷,少定義私有成員。
3.變量名不應(yīng)帶有類型信息毯辅,因為Python是動態(tài)類型語言埂伦。如 iValue、names_list思恐、dict_obj 等都是不好的命名沾谜。
常量
常量名所有字母大寫,由下劃線連接各個單詞如MAX_OVERFLOW胀莹,TOTAL基跑。
異常
以“Error”作為后綴。
縮寫
命名應(yīng)當(dāng)盡量使用全拼寫的單詞描焰,縮寫的情況有如下兩種:
1.常用的縮寫媳否,如XML、ID等,在命名時也應(yīng)只大寫首字母篱竭,如XmlParser力图。
2.命名中含有長單詞,對某個單詞進(jìn)行縮寫室抽。這時應(yīng)使用約定成俗的縮寫方式。
例如:
function 縮寫為 fn
text 縮寫為 txt
object 縮寫為 obj
count 縮寫為 cnt
number 縮寫為 num靡努,等坪圾。
前導(dǎo)后綴下劃線
一個前導(dǎo)下劃線:表示非公有。
一個后綴下劃線:避免關(guān)鍵字沖突惑朦。
兩個前導(dǎo)下劃線:當(dāng)命名一個類屬性引起名稱沖突時使用兽泄。
兩個前導(dǎo)和后綴下劃線:“魔”(有特殊用途)對象或者屬性,例如init或者file漾月。絕對不要創(chuàng)造這樣的名字病梢,而只是使用它們。
注意:關(guān)于下劃線的使用存在一些爭議梁肿。
Python 用下劃線作為變量前綴和后綴指定特殊變量蜓陌。
_xxx 不能用'from module import *'導(dǎo)入
xxx 系統(tǒng)定義名字
__xxx 類中的私有變量名
核心風(fēng)格:避免用下劃線作為變量名的開始。
因為下劃線對解釋器有特殊的意義吩蔑,而且是內(nèi)建標(biāo)識符所使用的符號钮热,我們建議程序員避免用下劃線作為變量名的開始。一般來講烛芬,變量名_xxx被看作是“私有的”隧期,在模塊或類外不可以使用。當(dāng)變量是私有的時候赘娄,用_xxx 來表示變量是很好的習(xí)慣仆潮。因為變量名xxx對Python 來說刑厥夂澹雜諂脹ǖ謀淞坑Φ北苊庹庵置綹瘛?br>
"單下劃線" 開始的成員變量叫做保護(hù)變量遣臼,意思是只有類對象和子類對象自己能訪問到這些變量性置;
"雙下劃線" 開始的是私有成員,意思是只有類對象自己能訪問揍堰,連子類對象也不能訪問到這個數(shù)據(jù)蚌讼。
以單下劃線開頭(_foo)的代表不能直接訪問的類屬性,需通過類提供的接口進(jìn)行訪問个榕,不能用“from xxx import *”而導(dǎo)入篡石;以雙下劃線開頭的(__foo)代表類的私有成員;以雙下劃線開頭和結(jié)尾的(foo)代表python里特殊方法專用的標(biāo)識西采,如 init()代表類的構(gòu)造函數(shù)凰萨。
特定命名方式
主要是指 xxx 形式的系統(tǒng)保留字命名法。項目中也可以使用這種命名,它的意義在于這種形式的變量是只讀的胖眷,這種形式的類成員函數(shù)盡量不要重載武通。如
class Base(object):
def init(self, id, parent = None):
self.id = id
self.parent = parent
def message(self, msgid):
…略
其中 id、parent 和 message 都采用了系統(tǒng)保留字命名法珊搀。
附:Google Python命名規(guī)范
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()
如果您已經(jīng)猜對了冶忱,那么可以不看我這篇博文了。如果你沒有猜對或者心里有所疑問境析,那我的這篇博文正是為您所準(zhǔn)備的囚枪。
一切由為什么會輸出“A.__private()”開始桌吃。但要講清楚為什么俐银,我們就有必要了解一下Python的命名機制。
據(jù) Python manual麦射,變量名(標(biāo)識符)是Python的一種原子元素沛鸵。當(dāng)變量名被綁定到一個對象的時候括勺,變量名就指代這個對象,就像人類社會一樣曲掰,不是嗎疾捍?當(dāng)變 量名出現(xiàn)在代碼塊中,那它就是本地變量栏妖;當(dāng)變量名出現(xiàn)在模塊中拾氓,它就是全局變量。模塊相信大家都有很好的理解底哥,但代碼塊可能讓人費解些咙鞍。在這里解釋一下:
代碼塊就是可作為可執(zhí)行單元的一段Python程序文本;模塊趾徽、函數(shù)體和類定義都是代碼塊续滋。不僅如此,每一個交互腳本命令也是一個代碼塊孵奶;一個腳本文件也是一個代碼塊疲酌;一個命令行腳本也是一個代碼塊。
接 下來談?wù)勛兞康目梢娦粤嗽覀円胍粋€范圍的概念朗恳。范圍就是變量名在代碼塊的可見性。如果一個代碼塊里定義本地變量载绿,那范圍就包括這個代碼塊粥诫。如果變量定義 在一個功能代碼塊里,那范圍就擴展到這個功能塊里的任一代碼塊崭庸,除非其中定義了同名的另一變量怀浆。但定義在類中的變量的范圍被限定在類代碼塊谊囚,而不會擴展到 方法代碼塊中。
迷蹤
據(jù)上節(jié)的理論执赡,我們可以把代碼分為三個代碼塊:類A的定義镰踏、類B的定義和變量b的定義。根據(jù)類定義沙合,我們知道代碼給類A定義了三個成員變量(Python的函數(shù)也是對象奠伪,所以成員方法稱為成員變量也行得通。)首懈;類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消失了即舌!這就要談?wù)凱ython的私有變量軋壓了佣盒。
探究
懂 Python的朋友都知道Python把以兩個或以上下劃線字符開頭且沒有以兩個或以上下劃線結(jié)尾的變量當(dāng)作私有變量挎袜。私有變量會在代碼生成之前被轉(zhuǎn)換為 長格式(變?yōu)楣校^D(zhuǎn)換機制是這樣的:在變量前端插入類名肥惭,再在前端加入一個下劃線字符盯仪。這就是所謂的私有變量軋壓(Private name mangling)。如類A里的__private標(biāo)識符將被轉(zhuǎn)換為_A__private蜜葱,這就是上一節(jié)出現(xiàn)_A__private和 __private消失的原因了全景。
再講兩點題外話:
一是因為軋壓會使標(biāo)識符變長,當(dāng)超過255的時候牵囤,Python會切斷爸黄,要注意因此引起的命名沖突。
二是當(dāng)類名全部以下劃線命名的時候揭鳞,Python就不再執(zhí)行軋壓炕贵。如:
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() # 可以外部調(diào)用
____.__method()
現(xiàn)在我們回過頭來看看為什么會輸出“A.__private()”吧!
真相
相信現(xiàn)在聰明的讀者已經(jīng)猜到答案了吧野崇?如果你還沒有想到称开,我給你個提示:真相跟C語言里的宏預(yù)處理差不多。
因為類A定義了一個私有成員函數(shù)(變量)乓梨,所以在代碼生成之前先執(zhí)行私有變量軋壓(注意到上一節(jié)標(biāo)紅的那行字沒有鳖轰?)。軋壓之后扶镀,類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方法臭觉,所以調(diào)用的仍然是A.init睛蛛,即執(zhí)行了self._A__private()鹦马,自然輸出“A.__private()”了。
下面的兩段代碼可以增加說服力忆肾,增進(jìn)理解:
class C(A):
def init(self): # 重寫init荸频,不再調(diào)用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() # 調(diào)用一個沒有定義的函數(shù),Python會把它給我的 ^^~
self.public()
def __private(self):
print 'A.__private()'
def public(self):
print 'A.public()'
a = A()
A.__private()
A.public()