• python多重继承,优先级


    python多重继承

    概念:
    1.经典类: 申明的时候,没有继承于object,多重继承的时候,会按照深度优先方式查找
    2.新式类:申明的时候,继承于object,多重继承的时候,会按照广度优先方式查找

    但是!! python3之后默认所有的无论是否继承object,都默认 继承object,即python3中所有类均为新式类
    所以得出结论,python3中的多重继承都是遵循广度优先的方式

    class D():
        pass
    class E():
        pass
    class F():
        pass
    class C(D, F):
        pass
    class B(E, D):
        pass
    class A(B, C):
        pass
    if __name__ == '__main__':
        print( A.__mro__)

    输出的是(<class '__main__.A'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.F'>, <class 'object'>)

    排序方法:

    mro顺序采用的是C3算法,了解参考:https://www.jianshu.com/p/6651ed35104c

    先根据集成的左右优先级顺序画出图,然后先找到入度为0的,即:A,然后把A的所有链接点删除,从左到右找到

    入度为0的,即:B,同理划掉B的所有连接点,下一个入度为0的就是E和C,所以下一个是E,继续同理下去就能得到上述输出结果了。

     super()

    class A():
      def __init__(self):
        print("Enter A")
        print("Leave A")
    class B(A):
      def __init__(self):
        print("Enter B")
        super(B, self).__init__()
        print("Leave B")
    class C(A):
      def __init__(self):
        print("Enter C")
        super(C, self).__init__()
        print("Leave C")
    class D(A):
      def __init__(self):
        print("Enter D")
        super(D, self).__init__()
        print("Leave D")
    class E(B, C, D):
      def __init__(self):
        print("Enter E")
        super(E, self).__init__()
        print("Leave E")
    E()
    print(E.__mro__)

    预期输出为:

    Enter E
    Enter B
    Enter C
    Enter D
    Enter A
    Leave A
    Leave D
    Leave C
    Leave B
    Leave E
    (<class '__main__.E'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>)

    梳理一下流程:

    1.先执行E中的打印语句  ENTER,然后走到了第一个super()

    2.根据继承关系,这里先走到B中,执行完B中的ENTER 打印语句后,又是一个super()继承,所以走到C中,执行C的ENTER语句所以这里是关键,是走到C而不是看BC没有任何继承关系而去走到D

    这里是按照__mro__顺序严格执行的,后续就是一步一步的执行输出如上

  • 相关阅读:
    MySQL性能优化的最佳经验
    18个网站SEO建议
    sql之left join、right join、inner join的区别
    PHP与MYSQL事务处理
    Firefox上Web开发工具库一览
    SphinxSE的安装
    python XML
    python yaml
    C语言文本处理
    Linux strace命令
  • 原文地址:https://www.cnblogs.com/alantammm/p/10648737.html
Copyright © 2020-2023  润新知