1、多继承 首先看下面一个多继承的代码例子 class A ( object ): def func ( self ): print ( "in A" ) class B ( A ): def func ( self ): A . func ( self ) print ( "in B" ) class C ( A ): def func ( self ): A . func ( self ) pri
1、多继承
- 首先看下面一个多继承的代码例子
def func(self):
print("in A")
class B(A):
def func(self):
A.func(self)
print("in B")
class C(A):
def func(self):
A.func(self)
print("in C")
class D(B,C):
def func(self):
B.func(self)
C.func(self)
print("in D")
d=D()
d.func()
执行结果如下:
in Ain B
in A
in C
in
这里达到了继承的目的,但是有一点问题,A类作为B类和C 类的父类,这里被执行了两次,显然这种处理方式有问题,当然这段代码中也是有一点问题的,需要注意一下,python中在使用继承的时候,调用父类方法绝对不能使用父类名去调用,而是要使用super()去调用,上面这段代码就是使用了父类名去调用了,所以A类被执行了两遍
- 再看下面一段代码
def func(self):
print("in A")
class B(A):
def func(self):
super().func()
print("in B")
class C(A):
def func(self):
super().func()
print("in C")
class D(B,C):
def func(self):
super().func()
print("in D")
d=D()
d.func()
执行结果如下:
in Ain C
in B
in
这里B和C顺序好像变化了,这就是根据python中MRO继承顺序机制而调用的结果
2、MRO原理
- MRO继承顺序可以有如下规则计算出来
- 子类永远在父类前面
- 同一等级的类按照继承的顺序摆放
- 根据上述两条规则确定的顺序,倒过来即为调用顺序
实例:
比如如下继承关系,按照上述规则的顺序为:D,B,C,A,反过来即为A,C,B,D,即上述代码的结果顺序
实例:
若类的继承关系如下图所示,则按照上述规则得出的顺序为A,B,C,D,E,F,则调用顺序为F,E,D,C,B,A
3、查看MRO属性的方法
- 在实际代码调试过程中,不需要画图去分析调用顺序,python代码内置提供了一个属性,供查询类的继承关系,如下
def func(self):
print("in A")
class B(A):
def func(self):
super().func()
print("in B")
class C(A):
def func(self):
super().func()
print("in C")
class D(B,C):
def func(self):
super().func()
print("in D")
d=D()
print(D.__mro__)
d.func()
执行结果如下:可以看出通过类的__mro__属性即可查出类的继承关系,实际结果与其一致
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)in A
in C
in B
in