• 088 菱形继承问题


    一、类的分类

    回顾一下之前说过的类的分类

    1.1 新式类

    • 继承了object的类以及该类的子类,都是新式类
    • Python3中所有的类都是新式类

    1.2 经典类

    • 没有继承object的类以及该类的子类,都是经典类
    • 只有Python2中才有经典类

    二、菱形继承问题

    首先,Python中子类可以同时继承多个父类,如A(B,C,D)

    如果继承关系为菱形结构,即子类的父类最后继承了同一个类,那么属性的查找方式有两种

    • 经典类:深度优先
    • 新式类:广度优先

    2.1 经典类

    • 经典类:既 一条路走到黑。

    请观察图中调用顺序

    2.2 新式类

    • 广度优先,找到菱形的顶点结束(包括菱形顶点)继续下一个继承的父类往上找,找到菱形的顶点结束(不包含菱形定点)

    请观察图中调用顺序

    2.3 调用顺序

    class G(object):
        a = "GGG"
        pass
    class F(G):
        # a = "FFF"
        pass
    class E(G):
        # a = "EEE"
        pass
    class D(G):
        # a = "DDD"
        pass
    class C(F):
        # a="CCC"
        pass
    class B(E):
        # a="BBB"
        pass
    class A(B,C,D):
        # a="AAAA"
        pass
    
    a=A()
    print(a.a)
    

    2.3.1 基类的 mro() 方法

    • mro方法,返回列表,继承顺序查找列表(只在新式类中有)
    • 如果实在不清楚继承调用顺序,请调用mro方法,查看调用顺序
    print(A.mro())
    print(A.__mro__)
    

    三、总结

    继承的菱形问题(显示的都继承一个类,不是object类):新式类经典类查找顺序是不一样的

    新式类(py3中全是新式类):广度优先---从左侧开始,一直往上找,找到菱形的顶点结束(不包括菱形顶点),继续下一个继承的父类往上找,找到菱形的顶点结束(不包括菱形顶点),最后找到菱形顶点

    经典类(只有py2中才有):深度优先---从左侧开始,一直往上找,找到菱形的顶点结束(包括菱形顶点)继续下一个继承的父类往上找,找到菱形的顶点结束(不包含菱形定点)

    不出现菱形问题:正常查找

  • 相关阅读:
    2019年计划书单
    redis 分布式锁实现
    filter-grok,dissect匹配数据
    nohup-长期运行进程
    filter
    kill
    watch
    free
    jar
    tree
  • 原文地址:https://www.cnblogs.com/XuChengNotes/p/11419009.html
Copyright © 2020-2023  润新知