🐍Python 函数与面向对象

继承与MRO和super

面试回答

常见问法

Python 多继承下 MRO 是什么?super() 到底在找谁?

回答

MRO 是 Method Resolution Order,也就是方法解析顺序。Python 在多继承场景下会按 MRO 顺序查找属性和方法,常见采用 C3 线性化规则。

super() 不是简单地“调用父类”,更准确地说,它会沿当前类的 MRO 继续往后找下一个实现。

class A:
    def hello(self):
        print("A")

class B(A):
    def hello(self):
        print("B")
        super().hello()

追问

  • 为什么 super() 不等于“直接调父类名”
  • 多继承时如果每层都写 super() 会怎样
  • __mro__ 能看到什么

原理展开

最典型的面试点是菱形继承:

class A:
    def f(self):
        print("A")

class B(A):
    def f(self):
        print("B")
        super().f()

class C(A):
    def f(self):
        print("C")
        super().f()

class D(B, C):
    def f(self):
        print("D")
        super().f()

D().f() 会按 D -> B -> C -> A 的 MRO 走,而不是重复调用 A

print(D.__mro__)

所以面试里最好说: “super() 的语义是沿 MRO 协作调用,不是写死父类跳转。”

易错点

  • super() 理解成固定父类调用
  • 多继承时混用显式父类调用和 super()
  • 不知道 Python 是运行时按 MRO 查找方法