练习四十七:面向对象

阅读下面代码,分析它输出的结果

本例重点:super()内置函数

super() 函数是用于调用父类(超类)的一个方法。

super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。

MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。

  1 class A(object):
  2     def go(self):
  3         print('go to A')
  4     def stop(self):
  5         print('stop A')
  6     def pause(self):
  7         print('pause A')
  8 class B(A): #B继承A
  9     def go(self):
 10         super(B,self).go()#super(B,self) 首先找到 B 的父类(就是类 A),然后把类B的对象 B 转换为类 A 的对象
 11         print('go B')
 12 class C(A):
 13     def go(self):
 14         super(C,self).go()
 15         print('go C')
 16     def stop(self): 
 17         super(C,self).stop()
 18         print('stop C')
 19 
 20 class D(B,C):  #相当于D继承了A,B,C,原因B,C继承了A
 21     def go(self):
 22         super(D,self).go()
 23         print('go D')
 24     def stop(self):
 25         super(D,self).stop()
 26         print('stop D')
 27     def pause(self): #父类方法重写
 28         print('wait D')
 29 class E(B,C):
 30     pass
 31 a = A()
 32 b = B()
 33 c = C()
 34 d = D()
 35 e = E()
 36 
 37 a.go() #仅打印:go to A
 38 b.go() #打印父类和子类:go to A  go B
 39 c.go() #打印父类和子类:go to A  go C
 40 d.go() #打印父类和子类:go to A  go Bgo Cgo D
 41 e.go() #打印父类和子类:go to A  go Bgo C
 42 print('-----------------------------------')
 43 a.stop() #仅打印:stop A
 44 b.stop() #仅打印:stop A
 45 c.stop() #打印父类和子类;stop A|stop C
 46 d.stop() #打印父类和子类;stop A|stop C|stop D
 47 e.stop() #打印父类和子类;stop A|stop C
 48 print('-----------------------------------')
 49 a.pause() #仅打印:pause A
 50 b.pause() #仅打印:pause A
 51 c.pause() #仅打印:pause A
 52 d.pause() #仅打印:wait D
 53 e.pause() #仅打印:pause A

执行结果:

go to A
go to A
go B
go to A
go C
go to A
go C
go B
go D
go to A
go C
go B
-----------------------------------
stop A
stop A
stop A
stop C
stop A
stop C
stop D
stop A
stop C
-----------------------------------
pause A
pause A
pause A
wait D
pause A
原文地址:https://www.cnblogs.com/pinpin/p/10140517.html