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