gpt4 book ai didi

python - 在python3中使用super而不使用继承类

转载 作者:行者123 更新时间:2023-12-02 07:47:44 25 4
gpt4 key购买 nike

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

class ABC:

def __init__(self):
super(ABC, self).__init__()

最佳答案

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

>>> class ABC: pass
...
>>> ABC.__mro__
(<class '__main__.ABC'>, <class 'object'>)

如果class语句中存在任何显式命名的基类,这些基类及其基类将出现在MRO中新类和对象之间的某个位置。

>>> class ABC(str): pass
...
>>> ABC.__mro__
(<class '__main__.ABC'>, <class 'str'>, <class 'object'>)
<小时/>

关于您的问题“为什么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")

D 的 MRO 为 (D, B, C, A)。请注意 B.foo 中的 super().foo 调用。仅查看类 B,您可能会认为 super().foo() 是对 A.foo< 的调用。但是,当 selfD 的实例时(例如 D().foo() 的情况),则 super 指的是 C,而不是 A,因为在 MRO 中 C 紧跟在 B 之后.

>>> D().foo()
A
C
B
D

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

关于python - 在python3中使用super而不使用继承类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60378354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com