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

来源:3-4 Python中的多态

hey哈哈

2022-10-09 21:08

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

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

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

写回答 关注

2回答

  • 土斤土斤
    2022-12-07 15:13:41

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

    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

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

    土斤土斤

    把BCD类的super()方法上面再各加一句,比如D类的super()的语句上面再加一句print('super D...')后去执行看看,也可以直观理解执行代码的顺序

    2022-12-07 15:28:13

    共 1 条回复 >

  • jackluo
    2022-10-10 17:37:18
    同问题,我以为是编译器串行的速度的原因,但是我执行了好几次,每次都是这个结果

Python3 进阶教程(新版)

学习函数式、模块和面向对象编程,掌握Python高级程序设计

41910 学习 · 236 问题

查看课程

相似问题