class A(object):
def func(self): print('A')class B(A):
def func(self): super().func() print('B')class C(A):
def func(self): super().func() print('C')class D(B,C):
def func(self): super().func() print('D')b = D()
b.func()print(B.mro())#2.7# 新式类 继承object类的才是新式类 广度优先# 经典类 如果你直接创建一个类在2.7中就是经典类 深度优先# print(D.mro())# D.mro()# 单继承 : 子类有的用子类 子类没有用父类
# 多继承中,我们子类的对象调用一个方法,默认是就近原则,找的顺序是什么?# 经典类中 深度优先# 新式类中 广度优先# python2.7 新式类和经典类共存,新式类要继承object# python3 只有新式类,默认继承object# 经典类和新式类还有一个区别 mro方法只在新式类中存在# super 只在python3中存在# super的本质 :不是单纯找父类 而是根据调用者的节点位置的广度优先顺序来的
B和C有共同父类,class D(B,C):先找B再找C最后找A
super按照棱形继承顺序查找,执行顺序类似多装饰器的套娃执行顺序。
如果A和E没有共同父类要保证所有类都能执行到,顺序就变为BACE
A和E有共同父类也要执行B后再执行A,因为如果执行C就不会执行A了(A不是C的父类)。
总结:
python3广度优先,但要保证所有的父类都搜索到,所以有的时候也会深度优先,在考虑继承顺序时,只需要考虑到能将所有的类都连起来就对了。