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中才有):深度优先---从左侧开始,一直往上找,找到菱形的顶点结束(包括菱形顶点)继续下一个继承的父类往上找,找到菱形的顶点结束(不包含菱形定点)

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

原文地址:https://www.cnblogs.com/XuChengNotes/p/11419009.html