为了账号安全,请及时绑定邮箱和手机立即绑定

请问这个多重继承的结果 为啥是 这样的顺序? 怎么来的

http://img4.sycdn.imooc.com/6342c75b0001a1d707480722.jpg

http://img4.sycdn.imooc.com/6342c7520001f3f608040242.jpg

D不是继承 B C么?  为啥运行结果不是  ABCD

正在回答

2 回答

查了大量资料,大概是这样。

python3的多继承采用的是c3算法,将复杂结构上的所有类都映射到一个线性顺序上,而这个顺序能够保证所有的类都被构造一次,这个也就是方法搜索的顺序mro


针对题目中的代码,mro顺序为D→B→C→A,这也就是方法的搜索顺序,而每一次执行方法的时候,比如执行D类的方法,碰到super()后就会跳过接下来的语句而直接往右边的顺序的类中去继续搜索方法,所以D类的print语句就会被先跳过,变成搜索B类的方法,而B类的方法中也有super(),所以也是继续跳过,直到A类中没有可以跳过的语句,就会先执行打印出来print ('init A...'),然后也是根据顺序依次把剩下的语句(此时剩下的都是print语句)都执行,A类执行完到C类到B类到D类。


提供一个网址:https://pythontutor.com/visualize.html#mode=edit

这个网站可以解析代码的执行顺序与细节,可以直观查看代码怎么执行的~

0 回复 有任何疑惑可以回复我~
#1

土斤土斤

把BCD类的super()方法上面再各加一句,比如D类的super()的语句上面再加一句print('super D...')后去执行看看,也可以直观理解执行代码的顺序
2022-12-07 回复 有任何疑惑可以回复我~
同问题,我以为是编译器串行的速度的原因,但是我执行了好几次,每次都是这个结果
0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

请问这个多重继承的结果 为啥是 这样的顺序? 怎么来的

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信