1. 程式人生 > >python3.6入門到高階(全棧) day020 多繼承,MRO和C3演算法

python3.6入門到高階(全棧) day020 多繼承,MRO和C3演算法

今日主要內容
1. 多繼承
繼承: x是一種y的時候.可以使用繼承關係. "is a"
一個類同時繼承多個類(python, c++)
孫悟空是一種猴子, 還是一種神仙

例 class ShenXian: # 神仙
def fei(self):
print("神仙都會⻜")
class Monkey: # 猴
def chitao(self):
print("猴⼦喜歡吃桃⼦")
class SunWukong(ShenXian, Monkey): # 孫悟空是神仙, 同時也是⼀只猴

pass
sxz = SunWukong() # 孫悟空
sxz.chitao() # 會吃桃⼦
sxz.fei()

2. 經典類的MRO
通過數型結構的深度優先遍歷
一條道走到黑(從左往右)

3. 新式類的MRO(重點, 難點) C3演算法
先拆分
再合併 第一項的頭和後面所有項的尾進行比較如果出現了. 就拿出來 如果沒出現. 下一項....
例 1 class A: pass
2 class B(A): pass
3 class C(A): pass

4 class D(B, C): pass
5 class E(C, A): pass
6 class Y: pass
7 class F(D,Y, E): pass
8 class G(E): pass
9 class H(G, F): pass
10
11 # 先拆分 再從下往上合併, 把前一項的頭和後面所有項的身體進行比較, 如果後面出現了則直接跳過, 沒有的話前一項接著往後走
12 # S(H) = H + S(G) + S(F) + GF HGFD BYEC A

13 # S(G) = G + S(E) GECA
14 # S(F) = F + S(D) + S(Y) + S(E) + DYE FDBYECA
15 # S(E) = E + S(C) + S(A) + CA ECA
16 # S(D) = D + S(B) + S(C) + BC DBCA
17 # S(B) = B + S(A) BA
18 # S(C) = C + S(A) CA
19 print(H.mro()) # HGFD BYEC A
引用 https://www.cnblogs.com/bk9527/p/9954366.html

4. super() (重點)
找MRO順序的下一個

例 class Foo:
def func1(self):
super().func1() # 此時找的是MRO順序中下⼀個類的func1()⽅法
print("我的⽼家. 就住在這個屯")
class Bar:
def func1(self):
print("你的⽼家. 不在這個屯")

class Ku(Foo, Bar):
def func1(self):
super().func1() # 此時super找的是Foo
print("他的⽼家. 不知道在哪個屯")
k = Ku() # 先看MRO . KU, FOO, BAR object
k.func1()
k2 = Foo() # 此時的MRO. Foo object
k2.func1() # 報錯