我正在玩python中的多重继承,我遇到了一个我无法理解它是如何发生的情况。
这是继承布局:
A F
/ \ |
B C |
\ | /
\ | /
D
大家熟悉的ABCD钻石。加上一个额外的“F”类,我把它扔进去是为了好玩。
这是代码:
class A(object):
def foo(self, call_from):
print "foo from A, call from %s" % call_from
super(A, self).foo("A")
class B(A):
def foo(self, call_from):
print "foo from B, call from %s" % call_from
super(B, self).foo("B")
class C(A):
def foo(self, call_from):
print "foo from C, call from %s" % call_from
super(C, self).foo("C")
class F(object):
def foo(self, call_from):
print "foo from F, call from %s" % call_from
class D(B, C, F):
def foo(self):
print "foo from D"
super(D, self).foo("D")
输出:
>>> d = D()
>>> d.foo()
foo from D
foo from B, call from D
foo from C, call from B
foo from A, call from C
foo from F, call from A
方法解析顺序:
>>> D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class '__main__.F'>, <type 'object'>)
foo from C, call from B
代替foo from C, call from D
foo from F, call from A
只是简单地把我赶走......
似乎super()
是根据方法解析顺序链接起来并忽略类之间的关系,但我不确定。
有人可以指出正确的方向来理解这种行为吗?
请记住,我正在尝试理解语言本身。不试图解决实际问题。所以我没有这个用例。但如果有人能指出一个用例,那就太好了:)
更新:
总而言之 - super() 只是让您知道接下来要根据 mro 调用什么。不需要父母。虽然 mro 基于继承层次结构构建,但 mro 本身并不是继承层次结构。