python:如何判断super()MRO下一个in-line顺序是什么?

本问题已经有最佳答案,请猛点这里访问。

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


阅读:Python的Super被认为是有害的,Python的Super()被认为是超级!

这两个资源可以回答你所有的问题。

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

MRO: E, C, A, D, B, object

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

注意super()没有引用父类。即使A继承自object而不是D,但D在MRO中紧随其后。所以为了回答你的问题,"next in line"指的是MRO。


super ()

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

1
2
3
4
5
6
class Derived(Base):
    def method(self, arg):
        # Maybe do something here
        super(Derived, self).method(arg)

    # Could so something here as well

super()函数实际上是通过返回一个代理类的对象来工作的,这个代理类将调用委托给父类。在本例中使用super()的好处是不需要显式地命名基类,这有助于可维护性。

super()函数还可以用于更复杂的多重继承情况,在这种情况下,它可以执行委托给姐妹类等操作