如何判断 super() MRO 下一个在线订单是什么?

How to tell what the super() MRO next-in-line order is?

我怎么知道 super() 将在 MRO 中采用哪条路径?

超级()

Python 中 super() 的主要目的是在派生 class 中调用重写的基 class 方法,就像 super 在其他语言中所做的那样。 通常这样做是为了使派生 class 方法可以通过在其自身代码之前或之后调用它来扩充基础 class 方法,而不是完全替换它。

class Derived(Base):
    def method(self, arg):
        # Maybe do something here
        super(Derived, self).method(arg)

    # Could so something here as well

super() 函数实际上通过返回代理对象 class 来工作,该代理将调用委托给父对象。 在这种情况下使用 super() 的优点是您不需要显式命名基 class,这有助于可维护性。

super() 函数也可以用在更复杂的多重继承情况下,它可以做一些事情,比如委托给姐姐 class

阅读:Python's Super Considered Harmful and Python’s super() considered super!.

这两个很好的资源应该可以回答您的所有问题。

简而言之,super() 使用标准方法解析顺序 (MRO) 来查找您要求的方法。看看这张图片:

E继承自C和D。C继承自A,A继承自object。 D 继承自 B,B 继承自 object。红色箭头显示 super() 在其搜索中使用的 MRO。

请注意 super() 而不是 引用父 class。即使 A 继承自 object 而不是 D,D 在 MRO 中紧随其后。因此,为了回答您的问题,"next in line" 指的是 MRO。