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