python 中變量的命名規(guī)范

出自: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):

…略

其中 idparentmessage 都采用了系統(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()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末客冈,一起剝皮案震驚了整個濱河市旭从,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌场仲,老刑警劉巖和悦,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異渠缕,居然都是意外死亡鸽素,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門亦鳞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來馍忽,“玉大人,你說我怎么就攤上這事燕差≡馑瘢” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵徒探,是天一觀的道長瓦呼。 經(jīng)常有香客問我,道長测暗,這世上最難降的妖魔是什么央串? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮碗啄,結(jié)果婚禮上质和,老公的妹妹穿的比我還像新娘。我一直安慰自己挫掏,他們只是感情好侦另,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尉共,像睡著了一般褒傅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上袄友,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天殿托,我揣著相機與錄音,去河邊找鬼剧蚣。 笑死支竹,一個胖子當(dāng)著我的面吹牛旋廷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播礼搁,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饶碘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了馒吴?” 一聲冷哼從身側(cè)響起扎运,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饮戳,沒想到半個月后豪治,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡扯罐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年负拟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歹河。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡掩浙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出启泣,到底是詐尸還是另有隱情涣脚,我是刑警寧澤示辈,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布寥茫,位于F島的核電站,受9級特大地震影響矾麻,放射性物質(zhì)發(fā)生泄漏纱耻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一险耀、第九天 我趴在偏房一處隱蔽的房頂上張望弄喘。 院中可真熱鬧,春花似錦甩牺、人聲如沸蘑志。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽急但。三九已至,卻和暖如春搞乏,著一層夾襖步出監(jiān)牢的瞬間波桩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工请敦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留镐躲,地道東北人储玫。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像萤皂,于是被迫代替她去往敵國和親撒穷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容

  • python 中變量的命名規(guī)范 模塊名: 小寫字母裆熙,單詞之間用_分割 ad_stats.py 包名: 和模塊名一樣...
    步_塵閱讀 2,476評論 0 0
  • Python語言特性 1 Python的函數(shù)參數(shù)傳遞 看兩個如下例子桥滨,分析運行結(jié)果: 代碼一: a = 1 def...
    伊森H閱讀 3,067評論 0 15
  • Python語言特性 1 Python的函數(shù)參數(shù)傳遞 看兩個如下例子,分析運行結(jié)果: 代碼一: a = 1 def...
    時光清淺03閱讀 490評論 0 0
  • 基礎(chǔ)1.r''表示''內(nèi)部的字符串默認(rèn)不轉(zhuǎn)義2.'''...'''表示多行內(nèi)容3. 布爾值:True弛车、False(...
    neo已經(jīng)被使用閱讀 1,682評論 0 5
  • 1/579文件IO文件介紹I/O流流的概念讀寫文件文件備份IO介紹大家應(yīng)該聽說過一句話:“好記性不如爛筆頭”齐媒。不僅...
    清清子衿木子水心閱讀 1,434評論 0 1