模塊名:
小寫字母汹族,單詞之間用_分割
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()