接上文Python开发从零开始-20.4-基础语法(面向对象),本文将继续介绍 Python 面向对象编程的相关知识。
2、多继承
多继承是指一个子类同时继承多个父类的属性和方法。
(1)基本语法
class 子类名(父类名1, 父类名2, ..., 父类名N): 语句块 |
(2)编程示例
1)多继承父类属性调用


(3)方法解析顺序(MRO)
前面示例是简单多继承属性和方法的调用,但是如果父类们中有相同的属性或方法呢?默认情况下,Python 会采用方法解析顺序(Method Resolution Order, MRO)来处理同名属性和方法调用问题。
MRO 由 C3 线性化算法计算,确保调用路径唯一、可预测。其核心算法原则为:
子类优先于父类:子类的属性和方法调用优先级一定是最高;
遵循声明顺序:按照父类们在声明列表中的顺序被访问,从左到右。
可以通过 类名.__mro__ 属性或类名.mro() 方法查看类的解析顺序。编程示例如下:

1)如果父类们拥有相同父类的情况
如果父类拥有相同的父类(爷爷类),这时情况即是著名的菱形问题(钻石问题),Python 将按照声明列表顺序解析。编程示例如下:

2)如果父类们拥有不同父类的情况
如果父类拥不同的父类(爷爷类),这时就会依据声明列表顺序,先解析第一个父类,依次向上解析......,然后再解析第二个父类......。编程示例如下:

3)如果子类的子类(孙子类)继承时产生冲突
如果父类拥不同的父类(爷爷类),且父类的声明顺序出现颠倒,这时子类声明将会出现冲突,这也是 MRO 的自检机制。编程示例如下:

4)自定义MRO
如果想自定义MRO,可以使用 __mro__ 属性或者 mro() 方法,但通常不推荐这样做,因为这样可能导致难以调试等相关问题。
(4)关于多继承方法实例问题
由于继承调用方法涉及多态相关知识,所以小编未进行深入讨论,待了解掌握了多态,自然会对类继承的方法调用有深刻理解。
(5)多继承的使用
1)多继承的优点
代码复用:多继承允许继承多个父类,可以提升代码复用性;
功能扩展:通过继承多个父类,子类可以很容易地扩展其功能;
2)多继承的缺点
容易产生菱形问题(钻石问题);
复杂性增加:多继承增加了类的复杂性和理解难度;
调试困难:由于多继承可能导致的方法调用顺序不明确,调试时可能会更加困难,尤其是在大型项目中。
在某些情况下,使用组合(即一个类包含其他类的实例作为其属性)可能比继承更加清晰和灵活。组合允许选择性地使用其他类的功能,而不是被迫继承所有功能。 |
受文章篇幅所限,下文将继续介绍 Python 面向对象编程的相关知识。