问答详情
源自:3-4 Python中的多态

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

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

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

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

提问者:hey哈哈 2022-10-09 21:08

个回答

  • 土斤土斤
    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

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

  • jackluo
    2022-10-10 17:37:18

    同问题,我以为是编译器串行的速度的原因,但是我执行了好几次,每次都是这个结果