当前位置: 移动技术网 > IT编程>脚本编程>Python > 第二十天- 多继承 经典MRO 新式MRO super()

第二十天- 多继承 经典MRO 新式MRO super()

2018年11月14日  | 移动技术网IT编程  | 我要评论

成都理工大学广播影视学院分数线,我们结婚了20101113,ca1327

 

# 多继承:
# 在继承关系中.⼦类自动拥有⽗类中除私有属性外其他所有内容.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) 问题
view code

 

 

# 经典类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
view code

 

# 新式类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
view code

continue...

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网