多继承

一个子类可以继承多个父类,就是多继承,并且拥有所有父类的属性和方法。

例如 孩子会继承自己的父亲和母亲的特征。 

1.语法:

class 子类名(父类名1,父类名2…) : pass

import python 继承父类 python继承多个父类_python 多继承

 

2.多继承注意事项

如果子类和父类有相同的方法,就会调用子类中的方法。

如果不同的父类中存在着相同的方法名称,子类对象调用的时候会调用哪个父类中的方法呢? Python会根据 MRO(method resolution order) 方法解析顺序列表进行查找。即(广度优先)

提示:开发时,需要避免这种容易产生混淆的情况!--如果父类之间存在同名的属性和方法,应尽量避免使用多继承。

import python 继承父类 python继承多个父类_多继承_02

import python 继承父类 python继承多个父类_子类_03

3.继承原理(钻石继承)

python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表,

为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。

而这个MRO列表的构造是通过一个C3线性化算法来实现的。我们不去深究这个算法的数学原理,它实际上就是合并所有父类的MRO列表并遵循如下三条准则:

1.子类会先于父类被检查

2.多个父类会根据它们在列表中的顺序被检查

3.如果对下一个类存在两个合法的选择,选择第一个父类

import python 继承父类 python继承多个父类_多继承_04

 

import python 继承父类 python继承多个父类_import python 继承父类_05

 

注意:D类有两个选择,默认选择B类执行。

在Python2.3之前,MRO是基于深度优先算法的,自2.3开始使用C3算法广度优先,定义类时需要继承object,这样的类称为新式类,否则为旧式类

 

4.多继承的super()本质

不是直接查找父类,而是根据调用节点的广度优先顺序执行的。

import python 继承父类 python继承多个父类_父类_06