class A:
def __init__(self):
self.a_attr = 'A attribute'
class B:
def __init__(self):
self.b_attr = 'B attribute'
class C(A, B):
def __init__(self):
super().__init__()
B.__init__(self)
Python多重继承下的方法解析顺序(MRO)
- MRO的确定方式:Python使用C3线性化算法来确定MRO。这个算法会综合考虑继承关系中的所有类,以一种既保证单调性(子类总是在父类之前),又能解决菱形继承问题(多个父类继承自同一个祖先类时避免重复调用祖先类的方法)的方式生成一个线性化的列表。
- 利用MRO完成初始化:在
C
类的初始化中,super().__init__()
会按照MRO的顺序调用下一个类(这里是A
类)的初始化方法,从而初始化A
类的属性。由于super()
调用是线性化的,在A
类初始化完成后,它不会继续调用B
类的初始化方法(因为MRO顺序是C -> A -> B
,A
之后不是B
),所以需要显式地调用B.__init__(self)
来初始化B
类的属性。这样就确保了C
类从A
和B
继承的所有属性都能正确初始化。