python中多重继承的调用过程

python中多重继承的调用过程,python,Python,我在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()

我在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()
并没有调用“父类”(这毫无意义,因为在多重继承中,可以有多个单亲类…),而是调用中的下一个类

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

如果让你困惑的是
super(C,self).foo分解为
B.foo
,即使
C
不是继承自
B
,你必须记住
super
将使用
self
的mro,在这种情况下,它确实包括
B
,因为
self
这里有一个
D
实例,不是
C
实例。这就是为什么
super
同时需要当前类和当前实例FWIW的原因

是因为类C从类D的继承中获得父类吗

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

我希望super(C,self).foo()会引发异常

如果类
super()

E类(C类):
def foo(self):
打印(“!E”)
super(E,self).foo()
打印(“E”)
E().foo()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“sup.py”,第65行,在foo中
super(E,self).foo()
文件“sup.py”,第50行,foo格式
super(C,self).foo()
AttributeError:“超级”对象没有属性“foo”

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

尽管名称不同,
super()
并没有调用“父类”(这毫无意义,因为在多重继承中,可以有多个单亲类…),而是调用中的下一个类

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

如果让你困惑的是
super(C,self).foo分解为
B.foo
,即使
C
不是继承自
B
,你必须记住
super
将使用
self
的mro,在这种情况下,它确实包括
B
,因为
self
这里有一个
D
实例,不是
C
实例。这就是为什么
super
同时需要当前类和当前实例FWIW的原因

是因为类C从类D的继承中获得父类吗

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

我希望super(C,self).foo()会引发异常

如果类
super()

E类(C类):
def foo(self):
打印(“!E”)
super(E,self).foo()
打印(“E”)
E().foo()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“sup.py”,第65行,在foo中
super(E,self).foo()
文件“sup.py”,第50行,foo格式
super(C,self).foo()
AttributeError:“超级”对象没有属性“foo”

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

超级调用基于
方法解析顺序进行。哪一部分让你感到困惑?请尝试
D.\uuuumro\uuuuuuuu
您希望输出是什么?你的理由是什么?我希望
super(C,self)。foo()
将抛出异常超级调用根据
方法解析顺序发生。哪一部分让你感到困惑?请尝试
D.\uuuumro\uuuuuuuu
您希望输出是什么?您的理由是什么?我希望
super(C,self).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'