【发布时间】:2014-05-17 17:58:36
【问题描述】:
超级方法在 python 中实际上是如何工作的?
在给定的代码中:
class A(object):
def test(self):
return 'A'
class B(A):
def test(self):
return 'B->'+super(B, self).test()
class C(A):
def test(self):
return 'C'
class D(B,C):
pass
print B().test() # B->A
print D().test() # B->C ????
# MRO of classes are as
print 'mro of A', A.__mro__ # [A,object]
print 'mro of B', B.__mro__ # [B,A,object]
print 'mro of C', C.__mro__ # [C,A,object]
print 'mro of D', D.__mro__ # [D,B,C,A,object]
当在 D 上调用 test 时,它会输出 B->C 而不是 B->A(这是我所期待的)。
B 中的 super 如何引用 C 的实例?
【问题讨论】:
-
我猜 mro 在超级方法的情况下工作方式不同。我认为当从 D 实例调用时,B 中的超级 mro 就像 [B,C,A,object]。
-
Raymond Hettinger 的帖子 super considered super 几乎是这方面的权威指南。
-
这是一个菱形继承的例子,你“想要”的东西是模棱两可的,无论给定的语言为你做什么,都可能会让你感到惊讶。如果您熟悉 Python MRO,则可以选择默认设置。但是对于显式优于隐式,在
D中重新定义test并显式调用您想要的任何基础,或者更好地完全重写该方法。 Python 是鸭子类型的,您正在尝试使用经典类型的继承。参考:en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem -
如果这是经典的类型化继承,则不会导致这种行为。详情请见python-history.blogspot.in/2010/06/method-resolution-order.html。
标签: python oop inheritance multiple-inheritance method-resolution-order