Python Mro 类继承中方法的搜索顺序

Python 2.X版本里类分类两种,经典类和新类。它们有什么区别呢?

其中之一是类的MRO (Method Resolution Order)不同。MRO是什么呢?

阅读以下程序,

class D: # Note: Old-style
    def f(self):
        return "D.f()"

class C(D):
    def f(self):
        return "C.f()"

class B(D): pass
class A(B, C): pass

a = A()
print a.f()

请问程序的输出是什么?

如果将上面程序中第一行改为:class D(object): 后输出又是什么呢?

经典类(旧类)版程序输入为:D.f()
而新类版本程序输出为: C.f()

MRO就是子类的继承图谱、继承顺序。也就是说经典类和新类的MRO使用的是不同的算法。 从上面的程序可以看出新类的MRO算法再“人性”一点。

对于新类,这里有一个 mro() 方法可以参考:
(在Python 2.7 中需要将 class D: 改为 class D(object):)

>>> a.__class__.mro()
[__main__.A, __main__.B, __main__.C, __main__.D, object]

新类MRO用的是C3算法[1]很有意思,推荐一读。

[1] The Python 2.3 Method Resolution Order
[2] Reference: Python’s new classes vs old classes