多重继承 — 类从多个父类继承的能力 — 在Python中出现是受到其他面向对象编程语言(例如C++)的启发,它有助于创建可重用的混合类。方法解析顺序(MRO)机制的开发花费了很多时间,以确保在方法冲突时的可预测性。
一个类可以从不同的基类中获得同名的方法。如何确定在调用时使用哪个方法呢?没有明确的方案会导致难以捕捉的错误。
Python实现了MRO算法(C3线性化),该算法在解决层次结构中的冲突时定义了严格的方法查找顺序。使用super()函数和类的__mro__方法分析继承链时,一切变得透明。
代码示例:
class A: def foo(self): print("A") class B(A): def foo(self): print("B") super().foo() class C(A): def foo(self): print("C") super().foo() class D(B, C): def foo(self): print("D") super().foo() D().foo() print(D.__mro__)
关键特点:
super()允许访问MRO链中的下一个类,而不是一个特定的父类;__mro__属性查看MRO顺序;如果父类方法名称相同,会发生什么?
答案:方法调用将按照MRO定义的顺序进行。链中找到的第一个所需名称的方法将被调用。
可以在不显式传递self的情况下使用super()吗?
答案:在Python 3中可以,类方法体内的super().method()调用等同于显式的super(类, self).method(),但仅限于类内部。
可以改变现有类的MRO顺序吗?
答案:MRO的顺序在类声明后是静态的,但可以进行研究(或创建一个具有不同继承顺序的新类)。
Parent.method(self)),这会破坏MRO;在项目中创建了两个具有相似方法的混合类,子类同时使用这两个混合类,但通过类名直接调用方法,破坏了事件顺序。
优点:
缺点:
在每个混合类的方法中使用super(),确保按照链条调用,而不是遗漏所需的行为。
优点:
缺点: