python多继承时,函数调用顺序

本文详细介绍了Python中多继承时的方法解析顺序(MRO),包括MRO的概念、作用以及如何查看类的MRO。通过实例解释了在子类未实现方法时如何按照MRO查找和调用父类方法,以及super()方法在MRO中的应用。同时,文章提及了Python 2.2之前和之后MRO算法的区别,分别是DLR和C3线性化算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python多继承时,函数调用顺序

问题的根源在于MRO算法

什么是MRO算法呢?Method Resolution Order。即方法解析顺序。
什么是方法解析顺序呢?就是当存在类的继承关系时,在子类父类中查找一个方法的顺序。
我们可以在类的.__mro__中查看该类的MRO。
比如 有 A,B(A), C(A), D(B, C)的类定义,我们可以查看D.__mro__会看到D,B,C,A,Object的顺序,也可以查看B.__mro__会看到B,A,Object。

通常有两种情况会触发按照mro的查找。
一,子类里没有实现这个方法。就会按照mro的顺序去找,直到找到为止。
比如 有 A, B: func(), C: func(), D(B,C),然后创建d=D(),调用d.func()。
因为class D没有实现func,于是按照mro的顺序,在B里面找到了并调用,然后结束。

二,super()方法,当使用此方法时候,会在mro里继续寻找下一个符合条件的函数并执行。
比如B:func()里面有super().func()。那么d.func()会依次分别调用B:func()和C:func()。
super方法常见于__init__中,因为我们要正确但不重复的初始化所有的父类。
只需要在A, B, C,D的__init__里都添加super().init(),调用d.init()时候,就会按照mro的顺序即D, B, C, A, Object依次调用其__init__()方法。

至于mro的顺序是如何计算的,可以详见下面的link。python 2.2 以前是Depth first left to right(DLR)算法,python 2.3以后是C3 Linearization algorithm 算法。这里就不再细说了。

参考文献
[1]: https://www.geeksforgeeks.org/method-resolution-order-in-python-inheritance/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值