第二十天- 多继承 经典MRO 新式MRO super()
程序员文章站
2022-04-14 19:13:54
1 class ShenXian: # 神仙 2 3 def fei(self): 4 print("神仙都会⻜") 5 6 class Monkey: # 猴 7 8 def chitao(self): 9 print("猴⼦喜欢吃桃⼦") 10 11 class SunWukong(ShenXi ......
# 多继承:
# 在继承关系中.⼦类自动拥有⽗类中除私有属性外其他所有内容.python⽀持多继承.子类可拥有多⽗类.
1 class shenxian: # 神仙 2 3 def fei(self): 4 print("神仙都会⻜") 5 6 class monkey: # 猴 7 8 def chitao(self): 9 print("猴⼦喜欢吃桃⼦") 10 11 class sunwukong(shenxian, monkey): # 孙悟空是神仙, 同时也是⼀只猴(自己有先自己,然后靠最近的,再其他) 12 pass 13 14 # sxz = sunwukong() # 孙悟空 15 # sxz.chitao() # 会吃桃⼦ 16 # sxz.fei() # 会⻜ 17 18 # 这就是多继承,但当两个⽗类中出现了重名⽅法的时候.就涉及到如何查找⽗类⽅法的问题. 19 # 即下面的 mro(method resolution order) 问题
# 经典类mro算法
# 在python2.2之前用,现已弃用(做面试题参考) 采用的树形结构的深度递归遍历
# 方法:从头开始.从左往右,一条道跑到底,然后回头.继续⼀条路跑到头.(画图)
1 # 画图排顺序 现用python版本已无法验证 2 class a: 3 pass 4 class b(a): 5 pass 6 class c(a): 7 pass 8 class d(b, c): 9 pass 10 class e: 11 pass 12 class f(d, e): 13 pass 14 class g(f, d): 15 pass 16 class h: 17 pass 18 class foo(h, g): 19 pass 20 21 # 结果 : foo--h--g--f--d--b--a--c--e
# 新式类mro算法(c3)
# 先拆后合 从下向上合并,拿出每一项的头和后一项的身体进行比较.
# 如果出现了就过,从后一项的头继续去比较.如果不出现就出来放到结果。
# (注意:每次都是拿 头一项 的头和后面的身体比较,出现了就过,这时把后一项的头作为头一项继续去比较,
# 若后一项的头在后面身体还有,继续这个操作...直到后面身体没有再返回前面的头,理解成一个循环)
1 class a: 2 pass 3 class b(a): 4 pass 5 class c(a): 6 pass 7 class d(b, c): 8 pass 9 class e(c, a): 10 pass 11 class f(d, e): 12 pass 13 class m(f, e): 14 pass 15 class n: 16 pass 17 class p(m,n): 18 pass 19 class g(p): 20 pass 21 class o: 22 pass 23 class x(o): 24 pass 25 class h(g, x, f): 26 pass 27 print(h.__mro__) 28 29 30 ''' 31 # 拆 注意别漏了末尾的 “gxf” 32 # 当类里面只有单个继承时不需要 33 l(h) = h + l(g) + l(x) + l(f) + gxf hgpmxfdbecano 34 35 l(g) = g + l(p) gpmfdbecan 36 l(x) = x + l(o) xo 37 l(f) = f + l(d) + l(e) + de fdbeca 38 39 l(p) = p + l(m) + l(n) + mn pmfdbecan 40 l(o) = o 41 l(d) = d + l(b) + l(c) + bc dbca 42 l(e) = e + l(c) + l(a) + ca eca 43 44 l(m) = m + l(f) + l(e) + fe mfdbeca 45 46 l(n) = n 47 l(b) = b + l(a) ba 48 l(c) = c + l(a) ca 49 l(a) = a 50 51 52 # hgpmxfdbecano
continue...