zoukankan      html  css  js  c++  java
  • 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__顺序严格执行的,后续就是一步一步的执行输出如上

  • 相关阅读:
    一个分油的逻辑问題C#实现
    vmware ESXI安装megacli
    搜索引擎Constellio及Google Search Appliances connectors
    MySQL 数据库性能优化之索引优化
    MySQL 数据库性能优化之缓存参数优化
    MySQL 数据库性能优化之表结构优化
    Spring中的WebAppRootListener
    MySQL 数据库性能优化之SQL优化
    8 个基于 Lucene 的开源搜索引擎推荐
    Spring 用户身份验证
  • 原文地址:https://www.cnblogs.com/alantammm/p/10648737.html
Copyright © 2011-2022 走看看