為什么Python類成員的調(diào)用和聲明必須有"this"?

Python的這種設(shè)計(jì)是作者從Modula-3中借鑒來的啼县,在后面使用的情況看來材原,這個(gè)設(shè)計(jì)也是比較成功的。我們對比Python和C++討論一下這個(gè)問題:

Modula-3是上世紀(jì)80年代末數(shù)字設(shè)備公司(DEC)系統(tǒng)研究中心(SRC)和Olivetti研究中心(ORC)設(shè)計(jì)的一門語言季眷。盡管這門語言沒有在業(yè)界廣泛的應(yīng)用起來余蟹,但這么語言對后面被發(fā)明的Java, Python, Caml, C# 都產(chǎn)生了很多的影響

首先,調(diào)用的時(shí)候要求指定"this"子刮,讓我們更明確的區(qū)分調(diào)用的是一個(gè)成員變量威酒、函數(shù)或者是一個(gè)局部變量、函數(shù)挺峡。當(dāng)我們讀到self.x或者self.meth()葵孤,即使我們不知道class的定義也能100%確定這里調(diào)用的是一個(gè)成員變量或者方法。我們設(shè)想一下橱赠,在C++中尤仍,我們還可以通過查看并排除所有的局部變量的方式去確認(rèn)變量是成員變量(假設(shè)全局變量很少見,即使出現(xiàn)也是"g_"這種很容易辨認(rèn)的)狭姨。而在Python中宰啦,由于變量不需要額外的定義,這個(gè)辦法就失效了饼拍,唯一的辦法就只有看class的定義赡模,所以this就成了必須的。 很多C++和Java的編碼規(guī)范中會(huì)規(guī)定成員函數(shù)或變量要有m_前綴师抄,我們也可以看到這種編碼規(guī)范是十分必要的漓柑。

其次,由于this這個(gè)對當(dāng)前實(shí)例的強(qiáng)制顯式引用叨吮,Python不需要引入任何新的語法就可以引用或者調(diào)用其它類(包括父類)的成員變量和函數(shù)辆布。在C++中,如果我們想要在子類中調(diào)用父類的函數(shù)挤安,我們需要用到::這個(gè)運(yùn)算符谚殊;在Python中我們這么寫baseclass.methodname(self, <argument list>)。Python的這種語法在實(shí)現(xiàn)子類的init()時(shí)特別有用蛤铜,例如我們經(jīng)常需要在子類中override父類的函數(shù)并且調(diào)用父類函數(shù)自身。

最后丛肢,就是性能上的些許考量:在Python的語言定義中围肥,局部變量就是在函數(shù)體中賦值,并且沒有在全局顯式的聲明過的變量蜂怎。當(dāng)然在語言設(shè)計(jì)上穆刻,我們有很多的辦法去告訴解釋器、編譯器某個(gè)變量賦值是針對一個(gè)局部變量還是一個(gè)成員變量杠步,但出于解釋性語言的性能考慮氢伟,最好是語義上的的規(guī)定榜轿。C++用變量必須顯示的聲明解決了這個(gè)問題,但Python沒有額外的變量聲明語法朵锣,如果僅僅是出于上面所說的目的引入類似C++的變量必須顯式的聲明就顯得太得不償失了谬盐。所以,self.var這種語法就是一個(gè)非常優(yōu)美的解決方案诚些。我們在函數(shù)里寫上self.var這種語法飞傀,解釋器就不用費(fèi)力地在全局范圍內(nèi)進(jìn)行變量的查找。換句話說诬烹,局部變量和成員變量存在于兩個(gè)不同的命名空間砸烦,我們需要告訴Python我們用的是哪個(gè)空間。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绞吁,一起剝皮案震驚了整個(gè)濱河市幢痘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌家破,老刑警劉巖颜说,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異员舵,居然都是意外死亡脑沿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門马僻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來庄拇,“玉大人,你說我怎么就攤上這事韭邓〈虢” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵女淑,是天一觀的道長瞭郑。 經(jīng)常有香客問我,道長鸭你,這世上最難降的妖魔是什么屈张? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮袱巨,結(jié)果婚禮上阁谆,老公的妹妹穿的比我還像新娘。我一直安慰自己愉老,他們只是感情好场绿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嫉入,像睡著了一般焰盗。 火紅的嫁衣襯著肌膚如雪璧尸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天熬拒,我揣著相機(jī)與錄音爷光,去河邊找鬼。 笑死梦湘,一個(gè)胖子當(dāng)著我的面吹牛瞎颗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捌议,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼哼拔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瓣颅?” 一聲冷哼從身側(cè)響起倦逐,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宫补,沒想到半個(gè)月后檬姥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粉怕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年健民,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贫贝。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡秉犹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出稚晚,到底是詐尸還是另有隱情崇堵,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布客燕,位于F島的核電站鸳劳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏也搓。R本人自食惡果不足惜赏廓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望傍妒。 院中可真熱鬧楚昭,春花似錦、人聲如沸拍顷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昔案。三九已至尿贫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間踏揣,已是汗流浹背庆亡。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捞稿,地道東北人又谋。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像娱局,于是被迫代替她去往敵國和親彰亥。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

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