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__顺序严格执行的,后续就是一步一步的执行输出如上

  • 相关阅读:
    PAT 1006 Sign In and Sign Out
    PAT 1004. Counting Leaves
    JavaEE开发环境安装
    NoSql数据库探讨
    maven的配置
    VMWARE 下使用 32位 Ubuntu Linux ,不能给它分配超过3.5G 内存?
    XCODE 4.3 WITH NO GCC?
    在苹果虚拟机上跑 ROR —— Ruby on Rails On Vmware OSX 10.7.3
    推荐一首让人疯狂的好歌《Pumped Up Kicks》。好吧,顺便测下博客园可以写点无关技术的帖子吗?
    RUBY元编程学习之”编写你的第一种领域专属语言“
  • 原文地址:https://www.cnblogs.com/alantammm/p/10648737.html
Copyright © 2011-2022 走看看