zoukankan      html  css  js  c++  java
  • python新式类的MRO


    class A1():
        pass
    class A2():
         def who_am_i(self):
             print("I am a A2")
    class A3():
         def who_am_i(self):
             print("I am a A3")
    class B(A1,A2):
        pass
    class C(A3):
        def who_am_i(self):
            print("I am a C")
    class D(C,B):
        pass
    d1 = D()
    d1.who_am_i()
    print(D.__mro__)
     

    python新式类的MRO是按照 《拓扑排序算法》 规则,用的是C3算法。

    你可以自己百度一下 拓扑排序算法, 其实就逐步消除入度为0(只有指向别的节点而没有被指向的)的节点的过程。
    用的是先左后右,先根后叶的两个原则。广度优先并不是简单的同级节点先左后右,而是指入度为0点。


    很明显先消D,输出D,
    这时C和B都是入度为0节点,消C(取左)之后输出D-C,
    这时入度为0的节点有A3和B,消A3(取左)之后输出D-C-A3
    这时入度为0的节点只有B了,消B之后之后输出D-C-A3-B
    这时入度为0的节点有A1和A2,消A1(取左)之后输出D-C-A3-B-A1
    这时入度为0的节点只剩A2,消A2之后输出D-C-A3-B-A1-A2
    最后输出MRO为 D-C-A3-B-A1-A2-Object

  • 相关阅读:
    python-django学习
    c++异常处理
    Python输入输出
    Python变量
    Python异常处理
    Python起源与发展
    vsftpd基于mysql的认证方式
    vsftpd搭建ftp服务,并实现虚拟用户访问
    httpd结合php的fpm模式
    编译安装apache
  • 原文地址:https://www.cnblogs.com/fan-1994716/p/13299279.html
Copyright © 2011-2022 走看看