gpt4 book ai didi

python - python中多重继承的调用过程

转载 作者:太空宇宙 更新时间:2023-11-03 20:26:33 25 4
gpt4 key购买 nike

我在 python 中遇到了一个类继承问题。

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

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

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


class D(C,B):
def foo(self):
print("!D")
super(D,self).foo()
print("D")

bar = D().foo()

为什么输出是

!D
!C
!B
A
B
C
D

是因为类C从类D的继承中得到了一个父类吗?

最佳答案

尽管有它的名字,super() 并没有调用“the”父类(这没有意义,因为通过多重继承,你可以拥有多个单父类类...)但在 the __mro__ 的下一个类上.

在您的情况下,D 的 mro 是 C、B、A,因此 D.foo 将调用 C。 foo 将调用 B.foo,而 B.foo 将调用 A.foo

如果让您感到困惑的是,即使 C 不继承,super(C, self).foo 也会解析为 B.fooB 开始,您必须记住 super 将使用 self 的 mro,在本例中确实包含 B > 因为这里的 self 是一个 D 实例,而不是 C 实例。这实际上就是为什么 super 需要当前类和当前实例 FWIW。

Is it because class C gets a parent class from class D's inheritance?

几乎...这不是它的工作原理(参见上面),但有效的结果非常相似。

I was expecting super(C,self).foo() will throw exception

如果类 super() 解析也没有 foo 方法(或者它具有不可调用的 foo 属性),则会发生这种情况:

class E(C):
def foo(self):
print("!E")
super(E,self).foo()
print("E")

E().foo()

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "sup.py", line 65, in foo
super(E,self).foo()
File "sup.py", line 50, in foo
super(C,self).foo()
AttributeError: 'super' object has no attribute 'foo'

这来自于 C 中的 super(C, self).foo() 调用 - 在本例中,是 E.__mro__ 中的下一个类object,它确实没有定义 foo 方法;-)

关于python - python中多重继承的调用过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57769776/

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