Python 方法解析顺序

Python Method Resolution Order

有人可以解释给定代码的输出以及 python MRO 在这种情况下的工作原理吗?

class A(object):
    def go(self):
        print("go A go!")


class B(A):
    def go(self):
        super(B, self).go()
        print("go B go!")


class C(A):
    def go(self):
        super(C, self).go()
        print("go C go!")


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


d = D()
d.go()

输出:

go A go!
go B go!
go C go!
go D go!

按照从左到右和深度我会说应该是:

go A go!
go C go!
go D go!

但似乎并没有像我想的那样工作。

class 的 MRO 是基于 parents 的 MRO:

>>> A.__mro__
(<class '__main__.A'>, <class 'object'>)
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
>>> C.__mro__
(<class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
>>> D.__mro__
(<class '__main__.D'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)

three rules 是:

  1. Children 走在 parents:
  2. 之前
  • A < object
  • B < A
  • C < A
  • D < C
  • D < B
  1. Parents 按碱基顺序排列:
  • C < B
  1. Parent mros 被合并,保留它们的顺序。
  • 合并 B < A < objectC < A < object

在Python2的早期,搜索规则曾经是depth-first-left-ot-right,但是根据对C3线性化算法的研究改变了。

请参阅 Super Considered Super 博客 post 了解在实际代码中利用此算法的方法。