阅读下面代码,分析它输出的结果
本例重点: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