MST

星途 面试题库

面试题:Python子类初始化中多重继承下的方法解析顺序(MRO)及初始化实现

假设有三个类`A`、`B`、`C`,`C`继承自`A`和`B` 。`A`和`B`都有各自的初始化方法,且都有不同的属性。请编写代码实现`C`类的初始化,确保所有父类的属性都能正确初始化,并解释Python在这种多重继承情况下是如何确定方法解析顺序(MRO)的,以及如何利用这个顺序来完成初始化的。
47.8万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
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)

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