Python 中的 super () 和 MRO
术语:
- MRO: 方法解析顺序 (Method Resolution Order, MRO)
环境:Python 3(Python 2 会有差别)
super()
首选可以参看 Python 3 版本中 super() 说明文档: PEP 3135 – New Super:
开篇即说:
1 | super() |
等价于:
1 | super(__class__, <firstarg>) |
super 指的是 MRO 中的下一个类!
1 | class A: |
下面我们测试说明。首先实例化 A 类,然后调用它的 spam 方法,很显然,会出错:
1 | a = A() |
那么,我们再做如下测试:
1 | c = C() |
你可以看到在 A 类中使用 super().spam() 实际上调用的是跟 A 类毫无关系的 B 类中的 spam() 方法。 这个用 C类 的 MRO 列表就可以完全解释清楚了:
1 | C.__mro__ |
在 MRO 顺序中, B 类时 A 类的下一个类即为 B 类。
参考: