Mow*_*gli 0 python abc super python-3.x
我有一个带有具体方法的 Python ABC(我们称之为A)__init__(),以及一个实现这个 ABC 的类(我们称之为B)。据我了解,我不应该能够实例化 ABC。
问题:类函数super().__init__()内部的调用为什么以及如何工作?我假设创建了父类的一个实例 - 在本例中是 ABC。__init__Bsuper()
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)
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评论中的链接,因为它帮助我进一步了解情况。
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 被设计为为您提供它们。
| 归档时间: |
|
| 查看次数: |
365 次 |
| 最近记录: |