摘要:和中有一個很大的區(qū)別就是類,無論是類的定義還是類的繼承。中類的繼承可以直接使用關(guān)鍵字代替原來的。中注釋掉了函數(shù),所以并沒有向后繼續(xù)執(zhí)行。如果中仍然有函數(shù)則會繼續(xù)向上去查找中是否有函數(shù)。
Py 2.x 和 Py 3.x 中有一個很大的區(qū)別就是類,無論是類的定義還是類的繼承。Py 3.x 中類的繼承可以直接使用 super() 關(guān)鍵字代替原來的 super(Class, self)。
那么 super() 到底是依據(jù)什么來繼承的呢?今天就來分析下。
super()函數(shù)根據(jù)傳進(jìn)去的兩個參數(shù)具體作用如下:
通過第一參數(shù)傳進(jìn)去的類名確定當(dāng)前在MRO中的哪個位置。MRO(Method Resolution Order);
通過第二個參數(shù)傳進(jìn)去的self,確定當(dāng)前的MRO列表。
def super(cls, inst): mro = inst.__class__.mro() #確定當(dāng)前MRO列表 return mro[mro.index(cls) + 1] #返回下一個類
如下代碼:
class A(object): def name(self): print("name is xiaoming") #super(A,self).name() class B(object): def name(self): print("name is cat") class C(A,B): def name(self): print("name is wang") super(C,self).name()if __name__ == "__main__": c = C() print(c.__class__.__mro__) c.name()
執(zhí)行以上代碼輸出:當(dāng)執(zhí)行C類下的super()函數(shù)時,實(shí)際調(diào)用了A類下的name函數(shù)。A中注釋掉了super()函數(shù),所以并沒有向后繼續(xù)執(zhí)行。并且打印出了當(dāng)前MRO列表順序?yàn)镃,A,B,object.
(, , , )name is wangname is xiaoming
當(dāng)我們把A類中的注釋去掉后,執(zhí)行代碼輸出:可以看到,當(dāng)A執(zhí)行后繼續(xù)執(zhí)行了B中的name()函數(shù)。如果B中仍然有super函數(shù)則會繼續(xù)向上去查找object中是否有name()函數(shù)。
(, , , )name is wangname is xiaomingname is cat
關(guān)注公眾號:「Python專欄」,后臺回復(fù)「騰訊架構(gòu)資源1」,獲取由騰訊架構(gòu)師整理的大數(shù)據(jù)學(xué)習(xí)資源包全套?。?!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/43287.html
摘要:上一篇文章標(biāo)準(zhǔn)庫內(nèi)置函數(shù)下一篇文章標(biāo)準(zhǔn)庫內(nèi)置函數(shù)內(nèi)置函數(shù)返回一個新的對象,可以選擇帶有從獲取的元素。推薦使用內(nèi)置函數(shù)來檢測對象的類型,因?yàn)樗鼤紤]子類的情況。上一篇文章標(biāo)準(zhǔn)庫內(nèi)置函數(shù)下一篇文章標(biāo)準(zhǔn)庫內(nèi)置函數(shù) 上一篇文章:Python標(biāo)準(zhǔn)庫---5、內(nèi)置函數(shù)(P-K-R)下一篇文章:Python標(biāo)準(zhǔn)庫---7、內(nèi)置函數(shù)(V-W-X-Y-Z) 內(nèi)置函數(shù): showImg(https://...
摘要:但是,的本質(zhì)仍然是函數(shù),是構(gòu)造函數(shù)的另外一種寫法。報(bào)錯原生構(gòu)造函數(shù)的繼承對于一些原生的構(gòu)造函數(shù),比如,,,等,在是無法通過方法實(shí)現(xiàn)原生函數(shù)的內(nèi)部屬性,原生函數(shù)內(nèi)部的無法綁定,內(nèi)部屬性獲得不了。 在沒有學(xué)習(xí) ES6 之前,學(xué)習(xí) React,真的是一件非常痛苦的事情。即使之前你對 ES5 有著很好的基礎(chǔ),包括閉包、函數(shù)、原型鏈和繼承,但是 React 中已經(jīng)普遍使用 ES6 的語法,包括 ...
摘要:以下簡稱是語言的下一代標(biāo)準(zhǔn)。的繼承機(jī)制,實(shí)質(zhì)是先創(chuàng)造父類的實(shí)例對象所以必須先調(diào)用方法,然后再用子類的構(gòu)造函數(shù)修改。總結(jié)以上就是最常用的一些語法,可以說這的語法,在的日常使用中占了追加十分鐘好的嗎分鐘掌握核心內(nèi)容下 ECMAScript 6(以下簡稱ES6)是JavaScript語言的下一代標(biāo)準(zhǔn)。因?yàn)楫?dāng)前版本的ES6是在2015年發(fā)布的,所以又稱ECMAScript 2015。 也就是說...
摘要:廣州三本大三在讀,在廣州找實(shí)習(xí)。這篇文章其實(shí)主要是記錄一下自己的面試經(jīng)歷,希望大家看完之后能有所了解進(jìn)入中小公司究竟需要什么水平。時間復(fù)雜度盡量低一些使用快排的,將給出的隨機(jī)數(shù)做基準(zhǔn)值返回的坐標(biāo)就是了。 前言 只有光頭才能變強(qiáng) 這陣子跑去面試Java實(shí)習(xí)生啦~~~我來簡單介紹一下背景吧。 廣州三本大三在讀,在廣州找實(shí)習(xí)。大學(xué)開始接觸編程,一個非常平庸的人。 在學(xué)習(xí)編程時,跟我類似的人應(yīng)...
摘要:以下簡稱是語言的下一代標(biāo)準(zhǔn)。因?yàn)楫?dāng)前版本的是在年發(fā)布的,所以又稱。用它所聲明的變量,只在命令所在的代碼塊內(nèi)有效。的繼承機(jī)制,實(shí)質(zhì)是先創(chuàng)造父類的實(shí)例對象所以必須先調(diào)用方法,然后再用子類的構(gòu)造函數(shù)修改。 ECMAScript 6(以下簡稱ES6)是JavaScript語言的下一代標(biāo)準(zhǔn)。因?yàn)楫?dāng)前版本的ES6是在2015年發(fā)布的,所以又稱ECMAScript 2015。 也就是說,ES6就是E...
閱讀 1216·2021-11-24 09:38
閱讀 2621·2021-09-27 14:00
閱讀 1183·2019-08-30 15:55
閱讀 1360·2019-08-30 14:16
閱讀 1508·2019-08-30 10:54
閱讀 2890·2019-08-28 17:58
閱讀 770·2019-08-26 13:22
閱讀 1251·2019-08-26 12:01