經典類的mro
新式類的mro
class
a: pass
class
b(a):
pass
class
c(a):
pass
class
d(b, c):
pass
class
e(c, a):
pass
class
f(d, e):
pass
class
g(e):
pass
class
h(g, f):
pass
print(h.__mro__)
結果:
(, , , , , , ,, )
super()可以幫我們執行mro中下乙個父類的方法. 通常super()有兩個使用的地方:
可以訪問父類的構造方法
當子類方法想呼叫父類(mro)中的方法
方法一
class
foo:
def__init__(self, a, b, c):
self.a
= a self.b = b
self.c = c
class
bar(foo):
def__init__(self, a, b, c, d):
super().__init__(a, b, c) # 訪問父類的構造方法
self.d
= db = bar(1, 2, 3, 4)
print(b.__dict__)
結果:
方法二
class
foo:
deffunc1(self):
super().func1() # 此時找的是mro順序中下⼀個類的func1()方法
print("我的家. 就住在這個屯")
class
bar:
deffunc1(self):
print("你的家. 不在這個屯")
class
ku(foo, bar):
deffunc1(self):
super().func1() # 此時super找的是foo
print("他的家. 不知道在哪個屯")
k= ku() # 先看mro . ku, foo, bar object
k.func1()
k2 = foo() # 此時的mro. foo object
k2.func1() # 報錯
Python的多重繼承問題 MRO和C3演算法
有乙個sina的blog介紹的很好 python 多重繼承mro mro即method resolution order,主要用於在多繼承時判斷調的屬性的路徑 來自於哪個類 之前檢視了很多資料,說mro是基於深度優先搜尋演算法的。但不完全正確在python2.3之前是基於此演算法,但從python2...
mro和c3 演算法
mro案例 class a pass class b a pass class c a pass class d b,c pass class e c,a pass class f d,e pass class g e pass class h g,f pass 計算方法 先將每乙個類的繼承mro,...
python之路 MRO和C3演算法
多繼承的一種方法,一種查詢的順序 在python3 裡面是一種新類式mro 需要用都的是c3演算法 class a pass class b a pass class c a pass class d b,c pass class e c,a pass class f d,e pass class ...