python中使用多繼承,會涉及到查找順序(MRO)、重複調用(鑽石繼承,也叫菱形繼承問題)等python
MRO算法
MRO即method resolution order,用於判斷子類調用的屬性來自於哪一個父類。在Python2.3以前,MRO是基於深度優先算法的,自2.3開始使用C3算法,定義類時須要繼承object,這樣的類稱爲新式類,不然爲舊式類函數
從圖中能夠看出,舊式類查找屬性時是深度優先搜索,新式類則是廣度優先搜索spa
C3算法最先被提出是用於Lisp的,應用在Python中是爲了解決原來基於深度優先搜索算法不知足本地優先級,和單調性的問題。code
示例對象
看下面的例子blog
class X(object): def f(self): print 'x' class A(X): def f(self): print 'a' def extral(self): print 'extral a' class B(X): def f(self): print 'b' def extral(self): print 'extral b' class C(A, B, X): def f(self): super(C, self).f() print 'c' print C.mro() c = C() c.f() c.extral()
根據廣度搜索原則最早搜索到A,因此結果很明顯,以下所示繼承
類C沒有extral函數,調用的是子類的該函數。這種類的部分行爲由父類來提供的行爲,叫作抽象超類.io