今日主要内容
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() # 报错