多继承:multiple inheritance
字面意思:
多继承是指一个子类继承自两个或两个以上的基类。
基本语法:
class 类名(基类1,基类2,.......):
语句块
说明:
1.一个子类同时继承自多个父类,父类中的方法可以同时被继承。
2.如果两个父类中有同名方法,而在子类中有没有覆盖此方法,调用结果难以确定。(可以调用MRO方法查询,python内部是有一定机制解决这个问题,但是人类的自然语言很难分辨清楚,尤其是在继承比较复杂的情况下,所以我们暂且称之为难以确定。mro方法在后面会有所提及。)
多继承的优点:
没什么花里胡哨的,优点只有一个:方便
示例(优点):
class Father:
def math(self):
print('数学很好')
class Mother:
def english(self):
print('英语很好')
class Son(Father, Mother):
pass
son = Son()
#Son类不需要任何语句块,就可以把多个基类的方法全部继承过来。
son.math()
son.english()
运行结果(优点):
多继承的缺陷:
在使用多继承的过程中,很多时候,我们对我们想要继承的类认识并不深刻,对于这个基类的全部属性难以完全掌握。很容易就出现重名方法。
在方法重名时,python会根据自己的机制,来决定最终输出到底调用哪一个方法。而python的这个机制,并不符合我们的自然语言习惯。比如:在python解释器眼中,“儿子继承自爸爸和妈妈”和“儿子继承自妈妈和爸爸”有着不同的涵义。
下面我们写一个简单例子,看看重名时,python到底会如何去调用,可以通过选择性注释,去试试看。
class A:
def m(self):
print('A.m')
class B(A):
def m(self):
print('B.m')
class C(A):
def m(self):
print('C.m')
class D(B,C):
def m(self):
print('D.m')
d = D()
d.m() #其真实调用顺序为:D,B,C,A,Object(所有类的父类)
这个例子并不复杂,当继承关系的维度进一步加大时,我们就很难看出它的调用顺序。给我们的编程带来不小的麻烦。