为什么 super() 调用可以在派生自 ABC 的 Python 类中工作?

Mow*_*gli 0 python abc super python-3.x

我有一个带有具体方法的 Python ABC(我们称之为A__init__(),以及一个实现这个 ABC 的类(我们称之为B)。据我了解,我应该能够实例化 ABC。

问题:类函数super().__init__()内部的调用为什么以及如何工作?我假设创建了父类的一个实例 - 在本例中是 ABC。__init__Bsuper()

A级

from abc import ABC, abstractmethod
from util.fileManager import FileManager


class A(ABC):
    def __init__(self):
        self.file_manager = FileManager()  # Composition object

    ...
Run Code Online (Sandbox Code Playgroud)

B类,实现A类

from interfaces.A import A


class B(A):
    def __init__(self):
        super().__init__()

    ...
Run Code Online (Sandbox Code Playgroud)

编辑/解决方案

Python 中的“super”有什么作用?- super().__init__() 和显式超类 __init__() 之间的区别

正如你们许多人可能已经看到的那样,这个问题实际上可以归结为super()Python 中的作用。接受我标记的答案,我真的想指出@KarlKnechtel评论中的链接,因为它帮助我进一步了解情况。

che*_*ner 6

super()创建父级的实例。

的实例super(它是类型,而不是函数)为某些类集提供代理,以便属性查找解析为正确的类的值。调用super().__init__只是开始在 的 MRO 中查找type(self)(从 开始A)名为 的属性__init__

当参数显式提供给 时super,第二个参数确定您将搜索谁的MRO,第一个参数确定您在 MRO 中开始搜索的位置(即MRO 中参数之后的下一个类)。

一个极其非正统使用的例子super

>>> class A:
...   def foo(self):
...     print("A")
...
>>> class B(A):
...   def foo(self):
...     print("B")
...
>>> b = B()
>>> x = super(B, b)
>>> type(x)
<class 'super'>
>>> x.__thisclass__
<class '__main__.B'>
>>> x.__self__ is b
True
>>> x.foo()
A
Run Code Online (Sandbox Code Playgroud)

super它本身并没有真正的可选参数,但是您几乎总是使用它的上下文强烈暗示应该传递哪些参数,因此 Python 3 被设计为为您提供它们。