摘要:所以本文中使用的是新式類,而新式類的搜索算法是算法上面的代碼中是父類,是子類,我們?cè)陬愔匦露x了方法,就是在類的功能基礎(chǔ)基礎(chǔ)上新添功能。在這里的作用就是在子類中調(diào)用父類的方法,這個(gè)也是在單繼承常見調(diào)用的用法。
python的類分別有新式類和經(jīng)典類,都支持多繼承。在類的繼承中,如果你想要重寫父類的方法而不是覆蓋的父類方法,這個(gè)時(shí)候我們可以使用super()方法來(lái)實(shí)現(xiàn)
注意
Python2.2以前的版本:經(jīng)典類(classic class)時(shí)代
經(jīng)典類是一種沒有繼承的類,實(shí)例類型都是type類型,如果經(jīng)典類被作為父類,子類調(diào)用父類的構(gòu)造函數(shù)時(shí)會(huì)返回這樣的錯(cuò)誤 """TypeError: must be type, not classobj"""
這時(shí)MRO的方法為DFS(深度優(yōu)先搜索(子節(jié)點(diǎn)順序:從左到右))。所以本文中使用的是新式類,而新式類的搜索算法是C3算法
class C(object): def minus(self,x): return x/2 class D(C): def minus(self,x): super(D, self).minus() print "hello"
上面的代碼中C是父類,D是子類,我們?cè)贒類重新定義了minus方法,就是在C類的功能基礎(chǔ)基礎(chǔ)上新添print "hello"功能。super在這里的作用就是在子類中調(diào)用父類的方法,這個(gè)也是在單繼承常見調(diào)用super()的用法。那么問題來(lái)了
class A(object): def __init__(self): self.n = 10 def minus(self, m): self.n -= m class B(A): def __init__(self): self.n = 7 def minus(self, m): super(B,self).minus(m) self.n -= 2 b=B() b.minus(2) print b.n
那么上面的代碼中b.n的輸出是什么呢?為什么結(jié)果是2呢,而不是5呢?super(B,self).minus(m)明明是調(diào)用了父類的minus方法,可是輸出結(jié)果就是2,是你要明白現(xiàn)在B的實(shí)例,而不是A的實(shí)例,那么傳遞的self.n的數(shù)值是7,而不是10.
那么對(duì)于多繼承的時(shí)候,super又是怎樣工作的呢?來(lái),現(xiàn)在創(chuàng)建一個(gè)繼承A的C類,然后再創(chuàng)建一個(gè)繼承B,C的D類,看看怎樣調(diào)用super是重寫方法。
class C(A): def __init__(self): self.n = 12 def minus(self, m): super(C,self).minus(m) self.n -= 5 class D(B, C): def __init__(self): self.n = 15 def minus(self, m): super(D,self).minus(m) self.n -= 2 d=D() d.minus(2) print d.n
如上的代碼輸出的結(jié)果是什么呢?別心急,先看看它是怎樣運(yùn)行的。上面提及到新式類尋找子節(jié)點(diǎn)時(shí)候使用的是C3算法。那么它是怎么找呢。D->B->C->A->object。怎樣才能驗(yàn)證這個(gè)順序是對(duì)的呢。
D.__mro__ (, , , , )
Mro是什么呢?對(duì)于你定義的每一個(gè)類,Python 會(huì)計(jì)算出一個(gè)方法解析順序(Method Resolution Order, MRO)列表,它代表了類繼承的順序。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/44469.html
摘要:面向?qū)ο箢悓?duì)象實(shí)例類是一個(gè)抽象的存在實(shí)例是真實(shí)存在的類對(duì)象是類的實(shí)例好比說(shuō)門就是一個(gè)類我的屋門就是門的一個(gè)實(shí)例我的屋門是白顏色的而且打開和關(guān)閉時(shí)會(huì)發(fā)出聲響不管是顏色還是打開和關(guān)閉都是類賦予的屬性和行為至于白顏色和打開和關(guān)閉時(shí)發(fā)出的聲響是這個(gè) 面向?qū)ο驩OP 類(Class) 對(duì)象(Object) 實(shí)例(Instance) 類: 是一個(gè)抽象的存在實(shí)例: 是真實(shí)存在的類 對(duì)象: ...
摘要:說(shuō)到,大家可能覺得很簡(jiǎn)單呀,不就是用來(lái)調(diào)用父類方法的嘛。單繼承在單繼承中就像大家所想的那樣,主要是用來(lái)調(diào)用父類的方法的。你覺得執(zhí)行下面代碼后,的值是多少呢執(zhí)行結(jié)果如下這個(gè)結(jié)果說(shuō)明了兩個(gè)問題確實(shí)調(diào)用了父類的方法。 說(shuō)到 super, 大家可能覺得很簡(jiǎn)單呀,不就是用來(lái)調(diào)用父類方法的嘛。如果真的這么簡(jiǎn)單的話也就不會(huì)有這篇文章了,且聽我細(xì)細(xì)道來(lái)。? 約定 在開始之前我們來(lái)約定一下本文所使用的 ...
摘要:我們的小明,就這樣被一次次的往上傳導(dǎo)到了每一級(jí)的函數(shù)中,于是每一級(jí)打印的都是或者說(shuō)小明傻傻的分割線更新之前的說(shuō)法并不準(zhǔn)確,參見和準(zhǔn)確的說(shuō) super 的工作原理如下: def super(cls, inst): mro = inst.__class__.mro() return mro[mro.index(cls) + 1] 其中,cls 代表類,inst 代表實(shí)例,...
摘要:如今查找結(jié)果有誤,說(shuō)明繼承鏈?zhǔn)清e(cuò)誤的,因而極有可能是出錯(cuò)。真相一切都源于裝飾器語(yǔ)法糖。核心思路就是不要更改被裝飾名稱的引用。 本文首發(fā)于我的博客,轉(zhuǎn)載請(qǐng)注明出處 《神坑》系列將會(huì)不定期更新一些可遇而不可求的坑防止他人入坑,也防止自己再次入坑 簡(jiǎn)化版問題 現(xiàn)有兩個(gè) View 類: class View(object): def method(self): #...
摘要:橋接模式和裝飾模式的區(qū)別設(shè)計(jì)模式裝飾模式橋接模式和裝飾模式都是通過(guò)將繼承關(guān)系轉(zhuǎn)換為關(guān)聯(lián)關(guān)系從而減少系統(tǒng)中類的數(shù)量,降低系統(tǒng)的耦合性。裝飾器模式支持多層裝飾,通過(guò)不同的組合可以實(shí)現(xiàn)不同的行為。 產(chǎn)生橋接模式的動(dòng)機(jī): 假設(shè)這樣一種情況:我們有大中小型號(hào)的毛筆,有紅藍(lán)黑三種顏料。如果需要不同顏色,不同型號(hào)的毛筆有如下兩種設(shè)計(jì)方法: 為每一種型號(hào)的毛筆都提供三種顏料的版本。 將毛筆和顏料分開...
閱讀 1442·2023-04-25 19:00
閱讀 4135·2021-11-17 17:00
閱讀 1753·2021-11-11 16:55
閱讀 1511·2021-10-14 09:43
閱讀 3108·2021-09-30 09:58
閱讀 850·2021-09-02 15:11
閱讀 2118·2019-08-30 12:56
閱讀 1399·2019-08-30 11:12