class A:
def fuc(self):
print('A')
class C(A):
def fuc(self):
print('C')
class D(A):
def fuc(self):
print('D')
class B(C,D):
def fuc(self):
print('B')
b = B()
print(B.mro()) #[<class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>]
结果
在这里为什么先找的是D而不是A呢?虽然python在找的时候它其实已经知道了C后面有一个A,但是它要优先遵循从左往右的方向去找并且C->A,D->A,如果它直接找到A的话那么D的节点就会丢失,如果一个节点丢失的话就再也找不回来了,所以第三次结果它打印了D。
<2>乌龟继承:
这些类的继承关系如下图表示
class A:
def fuc(self):
print('A')
class B(A):
def fuc(self):
print('B')
class F(A):
def fuc(self):
print('F')
class C(B):
def fuc(self):
print('C')
class E(F):
def fuc(self):
print('E')
class D(E,C):
def fuc(self):
print('D')
print(D.mro())
#[<class '__main__.D'>, <class '__main__.E'>, <class '__main__.F'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
这种记录继承顺序它是新式类的继承顺序,所遵循的是广度优先
而在python2.7中就是经典类,它所遵循的深度优先即走过的路就不走了,在这里的结果就是D->E->F->A->C->B
总结:
如果是多个父类中有一个方法的名字都相同,一个子类继承了这些父类,当它去用这个方法的时候,它会优先从左往右去找
python2.7 新式类和经典类共存,新式类要继承object
python3 只有新式类,默认继承object
经典类和新式类还有一个区别就是mro方法之在新式类存在
super的本质
用到上面钻石继承的继承关系图,但代码稍微改动
class A:
def fuc(self):
print('A')
class C(A):
def fuc(self):
super().fuc()
print('C')
class D(A):
def fuc(self):
super().fuc()
print('D')
class B(C,D):
def fuc(self):
super().fuc()
print('B')
b = B()
b.fuc()
# A
# D
# C
# B
super它的本质不是单纯找父类,而是根据调用者的节点位置的广度优先顺序来找的
具体执行流程: