day021 MRO和c3演算法

2022-07-24 02:45:14 字數 1612 閱讀 9156

一. python的繼承. 多繼承

子類繼承父類.

為什麼要繼承? 為了節省開發時間. 調高開發效率. **得到了重用

在python中存在多繼承

mro(method resolution order) 方法路徑順序.

python2

1. 使用經典類(寫繼承關係的時候. 基類不繼承object)

2. 新式類(繼承關係的根. 是object)

python3

只有新式類

二. 經典類的mro

經典類的mro使用的是深度優先遍歷

三. 新式類的mro, c3(重點, 難點)

新式類中摒棄了(部分)舊的深度優先演算法. 使用c3演算法

如果你的繼承關係中沒有菱形繼承( 深度優先就夠了)

如果有菱形: 使用c3演算法來計算mro

假設c3演算法. l(x) 表示x的繼承關係

先拆分。 拆到你能看出結果為止. 反著進行merge()運算

合併- 歸併

merge(元組, 元組, 元組,。。。。。。。)

摘頭。頭和尾在比對,如果下乙個尾沒有這個頭, 頭就出現.  如果頭在後面的尾出現. 跳過該元組. 繼續下乙個頭. 直到最後乙個元組. 根自己匹配

四. super是神馬玩意

super可以訪問mro列表中的下乙個類中的內容. 找父類

# mro + super ⾯試題

class init(object):

def __init__(self, v):

print("init")

self.val = v

class add2(init):

def __init__(self, val):

print("add2")

super(add2, self).__init__(val)

print(self.val) # 5

self.val += 2 # 7

class mult(init):

def __init__(self, val):

print("mult")

super(mult, self).__init__(val)

self.val *= 5

class haha(init):

def __init__(self, val):

print("哈哈")

super(haha, self).__init__(val)

self.val /= 5

class pro(add2,mult,haha): #

pass

class incr(pro):

def __init__(self, val):

super(incr, self).__init__(val)

self.val += 1

print(incr.__mro__)

# p = incr(5) # mro: incr pro add2 mult haha init

# # 乙個物件. p : val: 8

# print(p.val)

c = add2(2) # mro: add2 init

print(c.val)

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,...

mro之C3演算法

c3演算法 歸併演算法 class a object pass class b a pass class c a pass class d b pass class e c pass class f d,e pass print f.mro 第一步先找到繼承的父類的mro d d,b,a,o e e...

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 ...