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