🐍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 查找方法