【问题标题】:Python Method Resolution OrderPython 方法解析顺序
【发布时间】:2021-03-05 12:41:42
【问题描述】:

有人可以解释给定代码的输出以及在这种情况下 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!

但它似乎不像我想的那样工作。

【问题讨论】:

  • 如果您在每次超级调用之前和之后打印可能会更清晰
  • 我明白但仍然不明白如何调用 B 方法。即使是这样,为什么不用另一个 A 调用呢?
  • 在每次超级调用之前添加这些打印,然后您将能够看到从哪里调用 A.go() - 使用结果更新您的问题。

标签: python oop inheritance multiple-inheritance method-resolution-order


【解决方案1】:

一个类的 MRO 是基于它的父母的 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. 孩子先于父母:
  1. 父母按照基地的顺序排列:
  • C
  1. 父 mros 被合并,保持它们的顺序。
  • B &lt; A &lt; objectC &lt; A &lt; object 合并

在 Python 2 的早期,搜索规则曾经是深度优先左右右,但根据对 C3 线性化算法的研究而改变。

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

【讨论】:

  • 谢谢,我现在基本清楚了。但仍然不知道为什么调用 B 方法。因为它与C合并?那次合并会发生什么?两种方法都被调用了?
  • D 的 mro 是 DCBAObj。这意味着按该顺序调用这些类。 B被调用是因为它在列表中,没有其他原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
相关资源
最近更新 更多