Python 19 MRO和C3演算法

2022-08-29 11:09:14 字數 2019 閱讀 6033

經典類的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 ...