国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

淺談python 里面的單下劃線與雙下劃線的區(qū)別

2020-02-16 10:53:58
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

在學(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()            
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宁蒗| 香港| 彭山县| 江孜县| 永昌县| 孟村| 教育| 大埔区| 巧家县| 分宜县| 石林| 松江区| 页游| 河南省| 清河县| 襄城县| 安多县| 广宗县| 嫩江县| 济阳县| 宁都县| 罗平县| 子洲县| 基隆市| 探索| 山丹县| 南部县| 清新县| 巨野县| 尚义县| 宁陕县| 栖霞市| 海兴县| 祁连县| 泾阳县| 柏乡县| 特克斯县| 大冶市| 孝昌县| 衡山县| 济阳县|