在python3中使用没有继承类的super

jac*_*118 4 python python-3.x

有人知道下面的代码意味着什么super(xxx, self).__init__()吗?它有什么作用?我虽然它应该是 ABC 类继承自其他类,但我没有看到继承自哪个类。

class ABC:

    def __init__(self):
        super(ABC, self).__init__()
Run Code Online (Sandbox Code Playgroud)

che*_*ner 5

super与类的方法解析顺序 (MRO) 一起使用。MRO始终至少包含两个类:类本身和object(因为所有类都隐式继承自object

>>> class ABC: pass
...
>>> ABC.__mro__
(<class '__main__.ABC'>, <class 'object'>)
Run Code Online (Sandbox Code Playgroud)

如果class语句中有任何明确命名的基类,这些基类及其基类将出现在 MRO 中新类和object.

>>> class ABC(str): pass
...
>>> ABC.__mro__
(<class '__main__.ABC'>, <class 'str'>, <class 'object'>)
Run Code Online (Sandbox Code Playgroud)

关于您的问题“为什么super?”,请考虑以下标准示例:

class A:
    def foo(self):
        print("A")


class B(A):
    def foo(self):
        super().foo()
        print("B")


class C(A):
    def foo(self):
        super().foo()
        print("C")


class D(B, C):
    def foo(self):
        super().foo()
        print("D")
Run Code Online (Sandbox Code Playgroud)

的 MROD(D, B, C, A)。请注意该呼叫super().fooB.foo。展望在类B,你可能会认为super().foo()是一个呼叫A.foo。但是 whenself是 的一个实例D(例如 的情况D().foo()), thensuper指的是C,而不是A,因为在 MRO 中C紧随其后B

>>> D().foo()
A
C
B
D
Run Code Online (Sandbox Code Playgroud)

foo以相反的顺序输出 MRO 中的类(sans objectA不使用,super因为A“引入”foo到层次结构中),从最少到最具体。