在學(xué)習(xí)Python的時(shí)候,很多人都不理解為什么在方法(method)前面會(huì)加好幾個(gè)下劃線,有時(shí)甚至兩邊都會(huì)加,比如像 __this__ 這種。在我看到上面的文章之前,我一直以為Python中這些下劃線的作用就像Golang中方法/函數(shù)的大小寫(xiě)一樣,或是一些其他語(yǔ)言中的 private 、 public 的作用一樣,但仔細(xì)深究,這不全是Python這樣設(shè)計(jì)的初衷。下面我們具體分析。
主要存在四種命名
1. object # 公用方法
2. __object__ # 內(nèi)建方法,用戶(hù)不要這樣定義
3. __object # 全私有,全保護(hù)
4. _object # 半保護(hù)
核心風(fēng)格:避免用下劃線作為變量名的開(kāi)始。
因?yàn)橄聞澗€對(duì)解釋器有特殊的意義,而且是內(nèi)建標(biāo)識(shí)符所使用的符號(hào),我們建議程序員避免用下劃線作為變量名的開(kāi)始。一般來(lái)講,變量名_object被看作是“私有的”,在模塊或類(lèi)外不可以使用,不能用'from module import *'導(dǎo)入。當(dāng)變量是私有的時(shí)候,用_object來(lái)表示變量是很好的習(xí)慣。
單下劃線+類(lèi)名,eg:_Class__object 機(jī)制就可以訪問(wèn)__object__了。因?yàn)樽兞棵鸰_object__對(duì)Python 來(lái)說(shuō)有特殊含義,對(duì)于普通的變量應(yīng)當(dāng)避免這種命名風(fēng)格。
“單下劃線” 開(kāi)始的成員變量叫做保護(hù)變量,意思是只有類(lèi)對(duì)象和子類(lèi)對(duì)象自己能訪問(wèn)到這些變量;”雙下劃線” 開(kāi)始的是私有成員,意思是只有類(lèi)對(duì)象自己能訪問(wèn),連子類(lèi)對(duì)象也不能訪問(wèn)到這個(gè)數(shù)據(jù)。(如下列所示)
以單下劃線開(kāi)頭_foo的代表不能直接訪問(wèn)的類(lèi)屬性,需通過(guò)類(lèi)提供的接口進(jìn)行訪問(wèn),不能用“from xxx import *”而導(dǎo)入;以雙下劃線開(kāi)頭的__foo代表類(lèi)的私有成員;以雙下劃線開(kāi)頭和結(jié)尾的__foo__代表python里特殊方法專(zhuān)用的標(biāo)識(shí),如 __init__()代表類(lèi)的構(gòu)造函數(shù)。
class Foo(): def __init__(): ... def public_method(): print 'This is public method' def __fullprivate_method(): print 'This is fullprivate_method' def _halfprivate_method(): print 'This is halfprivate_method' f = Foo() f.public_method() # OK f.__fullprivate_method() # Error occur f._halfprivate_method() # OK f._Foo__fullprivate_method() # OK
從上面的例子可以看出,f._halfprivate_method()可以直接訪問(wèn),確實(shí)是。不過(guò)根據(jù)python的約定,應(yīng)該將其視作private,而不要在外部使用它們,(如果你非要使用也沒(méi)轍),良好的編程習(xí)慣是不要在外部使用它。同時(shí),根據(jù)Python docs的說(shuō)明,_object和__object的作用域限制在本模塊內(nèi)。
大家看下面這段程序的輸出:
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()
新聞熱點(diǎn)
疑難解答
圖片精選