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