Python多继承与super中执行顺序问题及解决过程
作者:Zswdhy
本文通过实例详细解析了Python中多继承类的构造和方法解析顺序(MRO),展示了当子类继承多个父类时,如何正确调用基类的方法,特别关注了super()函数的使用,解释了其在多继承场景下的行为,以及如何避免方法调用冲突
Python多继承与super中执行顺序
class A(object):
def go(self):
print("go A go!")
def stop(self):
print("stop A stop!")
class B(A):
def go(self):
super().go()
print("go B go!")
class C(A):
def go(self):
super().go()
print("go C go!")
def stop(self):
super().stop()
print("stop C stop!")
class D(B, C):
def go(self):
super(D, self).go()
print("go D go!")
def stop(self):
super().stop()
print("stop D stop!")
class E(B, C):
pass
a = A()
b = B()
c = C()
d = D()
d.go()
d.stop()个人理解,如出现错误请指教
类D多继承于类B、C,类B、C都继承于类A
执行到d.go()时,首先执行类D自己的go方法,代码执行到super().go(),
首先去调用D类的第一个父类B中的go方法,(相当于获取一个内存地址)同样遇到super().go(),
进而调用A类中的go方法,打印出 go A go! (B中的内存地址并未释放
然后执行D的第二个父类C,调用C中的go方法,C中重写A中的go方法,
但是先执行B中的go方法,但是此时调用C的父类A中的go方法时,
已经被B先一步的调用,因此执行C自己go方法中的打印语句,此时C调用完毕,释放地址,但是B的地址未释放,接着执行B中的打印语句
最后执行D中的打印语句
执行结果
如下:
go A go!
go C go!
go B go!
go D go!
stop A stop!
stop C stop!
stop D stop!
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
