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

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


模塊名:

小寫字母汹族,單詞之間用_分割

ad_stats.py

包名:

和模塊名一樣

類名:

單詞首字母大寫

AdStats

ConfigUtil

全局變量名(類變量,在java中相當(dāng)于static變量):

大寫字母其兴,單詞之間用_分割

NUMBER

COLOR_WRITE

普通變量:

小寫字母匀归,單詞之間用_分割

this_is_a_var

實(shí)例變量:

以_開頭徙赢,其他和普通變量一樣

_price

_instance_var

私有實(shí)例變量(外部訪問會報(bào)錯(cuò)):

以__開頭(2個(gè)下劃線)枕屉,其他和普通變量一樣

__private_var

專有變量:

__開頭哨颂,__結(jié)尾,一般為python的自有變量腹备,不要以這種方式命名

__doc__

__class__

普通函數(shù):

和普通變量一樣:

get_name()

count_number()

ad_stat()

私有函數(shù)(外部訪問會報(bào)錯(cuò)):

以__開頭(2個(gè)下劃線)衬潦,其他和普通函數(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ù)和方法的參數(shù)

總使用“self”作為實(shí)例方法的第一個(gè)參數(shù)今缚∷懔總使用“cls”作為類方法的第一個(gè)參數(shù)。

如果一個(gè)函數(shù)的參數(shù)名稱和保留的關(guān)鍵字沖突姓言,通常使用一個(gè)后綴下劃線好于使用縮寫或奇怪的拼寫瞬项。

全局變量

對于from M import *導(dǎo)入語句,如果想阻止導(dǎo)入模塊內(nèi)的全局變量可以使用舊有的規(guī)范何荚,在全局變量上加一個(gè)前導(dǎo)的下劃線囱淋。

*注意*:應(yīng)避免使用全局變量

變量

變量名全部小寫,由下劃線連接各個(gè)單詞餐塘。如color = WHITE妥衣,this_is_a_variable = 1

*注意*:

1.不論是類成員變量還是全局變量,均不使用 m 或 g 前綴戒傻。

2.私有類成員使用單一下劃線前綴標(biāo)識税手,多定義公開成員,少定義私有成員需纳。

3.變量名不應(yīng)帶有類型信息芦倒,因?yàn)镻ython是動(dòng)態(tài)類型語言。如 iValue候齿、names_list熙暴、dict_obj 等都是不好的命名闺属。

常量

常量名所有字母大寫,由下劃線連接各個(gè)單詞如MAX_OVERFLOW周霉,TOTAL掂器。

異常

以“Error”作為后綴。

縮寫

命名應(yīng)當(dāng)盡量使用全拼寫的單詞俱箱,縮寫的情況有如下兩種:

1.常用的縮寫国瓮,如XML、ID等狞谱,在命名時(shí)也應(yīng)只大寫首字母乃摹,如XmlParser。

2.命名中含有長單詞跟衅,對某個(gè)單詞進(jìn)行縮寫孵睬。這時(shí)應(yīng)使用約定成俗的縮寫方式。

例如:

function 縮寫為 fn

text 縮寫為 txt

object 縮寫為 obj

count 縮寫為 cnt

number 縮寫為 num伶跷,等掰读。

前導(dǎo)后綴下劃線

一個(gè)前導(dǎo)下劃線:表示非公有。

一個(gè)后綴下劃線:避免關(guān)鍵字沖突叭莫。

兩個(gè)前導(dǎo)下劃線:當(dāng)命名一個(gè)類屬性引起名稱沖突時(shí)使用蹈集。

兩個(gè)前導(dǎo)和后綴下劃線:“魔”(有特殊用途)對象或者屬性,例如__init__或者_(dá)_file__雇初。絕對不要?jiǎng)?chuàng)造這樣的名字拢肆,而只是使用它們。

*注意*:關(guān)于下劃線的使用存在一些爭議靖诗。

Python 用下劃線作為變量前綴和后綴指定特殊變量郭怪。

_xxx????? 不能用'from module import *'導(dǎo)入

__xxx__ 系統(tǒng)定義名字

__xxx??? 類中的私有變量名

核心風(fēng)格:避免用下劃線作為變量名的開始。

因?yàn)橄聞澗€對解釋器有特殊的意義呻畸,而且是內(nèi)建標(biāo)識符所使用的符號移盆,我們建議程序員避免用下劃線作為變量名的開始。一般來講伤为,變量名_xxx被看作是“私有的”咒循,在模塊或類外不可以使用。當(dāng)變量是私有的時(shí)候绞愚,用_xxx 來表示變量是很好的習(xí)慣叙甸。因?yàn)樽兞棵鸰_xxx__對Python 來說刑厥夂澹雜諂脹ǖ謀淞坑Φ北苊庹庵置綹瘛?br>

"單下劃線" 開始的成員變量叫做保護(hù)變量位衩,意思是只有類對象和子類對象自己能訪問到這些變量裆蒸;

"雙下劃線" 開始的是私有成員,意思是只有類對象自己能訪問糖驴,連子類對象也不能訪問到這個(gè)數(shù)據(jù)僚祷。

以單下劃線開頭(_foo)的代表不能直接訪問的類屬性佛致,需通過類提供的接口進(jìn)行訪問,不能用“from xxx import *”而導(dǎo)入辙谜;以雙下劃線開頭的(__foo)代表類的私有成員俺榆;以雙下劃線開頭和結(jié)尾的(__foo__)代表python里特殊方法專用的標(biāo)識,如 __init__()代表類的構(gòu)造函數(shù)装哆。

特定命名方式

主要是指 __xxx__ 形式的系統(tǒng)保留字命名法罐脊。項(xià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命名機(jī)制

引子

我熱情地邀請大家猜測下面這段程序的輸出:

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ī)制。

據(jù) Python manual润绵,變量名(標(biāo)識符)是Python的一種原子元素线椰。當(dāng)變量名被綁定到一個(gè)對象的時(shí)候,變量名就指代這個(gè)對象尘盼,就像人類社會一樣憨愉,不是嗎?當(dāng)變 量名出現(xiàn)在代碼塊中卿捎,那它就是本地變量配紫;當(dāng)變量名出現(xiàn)在模塊中,它就是全局變量午阵。模塊相信大家都有很好的理解躺孝,但代碼塊可能讓人費(fèi)解些。在這里解釋一下:

代碼塊就是可作為可執(zhí)行單元的一段Python程序文本底桂;模塊植袍、函數(shù)體和類定義都是代碼塊。不僅如此籽懦,每一個(gè)交互腳本命令也是一個(gè)代碼塊于个;一個(gè)腳本文件也是一個(gè)代碼塊;一個(gè)命令行腳本也是一個(gè)代碼塊暮顺。

接 下來談?wù)勛兞康目梢娦蕴ǎ覀円胍粋€(gè)范圍的概念秀存。范圍就是變量名在代碼塊的可見性败玉。如果一個(gè)代碼塊里定義本地變量靡努,那范圍就包括這個(gè)代碼塊溅固。如果變量定義 在一個(gè)功能代碼塊里躯保,那范圍就擴(kuò)展到這個(gè)功能塊里的任一代碼塊泣矛,除非其中定義了同名的另一變量跋涣。但定義在類中的變量的范圍被限定在類代碼塊护姆,而不會擴(kuò)展到 方法代碼塊中诉探。

迷蹤

據(jù)上節(jié)的理論汇荐,我們可以把代碼分為三個(gè)代碼塊:類A的定義洞就、類B的定義和變量b的定義。根據(jù)類定義掀淘,我們知道代碼給類A定義了三個(gè)成員變量(Python的函數(shù)也是對象旬蟋,所以成員方法稱為成員變量也行得通。)革娄;類B定義了兩個(gè)成員變量倾贰。這可以通過以下代碼驗(yàn)證:

>>> print '\n'.join(dir(A))

_A__private

__init__

public

>>> print '\n'.join(dir(B))

_A__private

_B__private

__init__

public

咦,為什么類A有個(gè)名為_A__private的 Attribute 呢拦惋?而且__private消失了匆浙!這就要談?wù)凱ython的私有變量軋壓了。

探究

懂 Python的朋友都知道Python把以兩個(gè)或以上下劃線字符開頭且沒有以兩個(gè)或以上下劃線結(jié)尾的變量當(dāng)作私有變量厕妖。私有變量會在代碼生成之前被轉(zhuǎn)換為 長格式(變?yōu)楣校┦啄帷^D(zhuǎn)換機(jī)制是這樣的:在變量前端插入類名,再在前端加入一個(gè)下劃線字符言秸。這就是所謂的私有變量軋壓(Private name mangling)软能。如類A里的__private標(biāo)識符將被轉(zhuǎn)換為_A__private,這就是上一節(jié)出現(xiàn)_A__private和 __private消失的原因了举畸。

再講兩點(diǎn)題外話:

一是因?yàn)檐垑簳箻?biāo)識符變長查排,當(dāng)超過255的時(shí)候,Python會切斷抄沮,要注意因此引起的命名沖突跋核。

二是當(dāng)類名全部以下劃線命名的時(shí)候,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)猜到答案了吧?如果你還沒有想到聪全,我給你個(gè)提示:真相跟C語言里的宏預(yù)處理差不多泊藕。

因?yàn)轭怉定義了一個(gè)私有成員函數(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()'

是不是有點(diǎn)像C語言里的宏展開啊讼呢?

因?yàn)樵陬怋定義的時(shí)候沒有覆蓋__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)用一個(gè)沒有定義的函數(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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市看蚜,隨后出現(xiàn)的幾起案子叫搁,更是在濱河造成了極大的恐慌,老刑警劉巖供炎,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渴逻,死亡現(xiàn)場離奇詭異,居然都是意外死亡音诫,警方通過查閱死者的電腦和手機(jī)惨奕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纽竣,“玉大人墓贿,你說我怎么就攤上這事◎寻保” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵队伟,是天一觀的道長穴吹。 經(jīng)常有香客問我,道長嗜侮,這世上最難降的妖魔是什么港令? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮锈颗,結(jié)果婚禮上顷霹,老公的妹妹穿的比我還像新娘。我一直安慰自己击吱,他們只是感情好淋淀,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著覆醇,像睡著了一般朵纷。 火紅的嫁衣襯著肌膚如雪炭臭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天袍辞,我揣著相機(jī)與錄音鞋仍,去河邊找鬼。 笑死搅吁,一個(gè)胖子當(dāng)著我的面吹牛威创,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谎懦,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼那婉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了党瓮?” 一聲冷哼從身側(cè)響起详炬,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寞奸,沒想到半個(gè)月后呛谜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枪萄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年隐岛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓷翻。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡聚凹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出齐帚,到底是詐尸還是另有隱情妒牙,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布对妄,位于F島的核電站湘今,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏剪菱。R本人自食惡果不足惜摩瞎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望孝常。 院中可真熱鬧旗们,春花似錦、人聲如沸构灸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至驰贷,卻和暖如春盛嘿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背括袒。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工次兆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锹锰。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓芥炭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恃慧。 傳聞我的和親對象是個(gè)殘疾皇子园蝠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

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

  • 基礎(chǔ)1.r''表示''內(nèi)部的字符串默認(rèn)不轉(zhuǎn)義2.'''...'''表示多行內(nèi)容3. 布爾值:True、False(...
    neo已經(jīng)被使用閱讀 1,660評論 0 5
  • 1.1面向?qū)ο?面向?qū)ο?object-oriented ;簡稱: OO)至今還沒有統(tǒng)一的概念 我這里把它定義為:...
    TENG書閱讀 561評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理痢士,服務(wù)發(fā)現(xiàn)彪薛,斷路器,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 一 玫玫今年15歲怠蹂,是個(gè)初二女學(xué)生善延。相比起其他同學(xué)而言,大了一歲的玫玫無論是行為還是思想都要比他們的思慮多了幾分城侧,...
    淺淺深閱讀 892評論 1 1
  • 這是我喜歡你的第428天易遣。 428個(gè)日子,不算長嫌佑,對于一些戀情長達(dá)十幾年的情侶來說豆茫,根本就是不值一提。但是也不算短...
    盛夏的光年閱讀 374評論 1 0