python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python多继承与super中执行顺序

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!

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文