关于python MRO以及super()的行为方式

时间:2013-12-12 14:10:07

标签: python class python-2.7 super method-resolution-order

今天我试图弄清楚__mro__和超级如何在python中工作,我发现了一些有趣的东西以及对我来说很奇怪,因为我在阅读__mro__之后得到了一些我不理解的东西。 。这是代码片段。

Code Snippets 1:

#!/usr/bin/pyhon

class A(object):
    def test(self):
        return 'A'

class B(A):
    def test(self):
        return 'B to %s' % super(B, self).test()

class C(A):
    def test(self):
        return 'C'

class D(B, C):
    pass

print D().test()

输出:

 B to C

代码片段2:当我更新我的超级内部课程B时:

#!/usr/bin/pyhon

class A(object):
    def test(self):
        return 'A'

class B(A):
    def test(self):
        return 'B to %s' % super(C, self).test()

class C(A):
    def test(self):
        return 'C'

class D(B, C):
    pass

print D().test()

输出:

B to A

然后现在我得到了我之前的预期。有人可以解释一下mro如何与super合作?

1 个答案:

答案 0 :(得分:3)

D的MRO是[D,B,C,A,对象]。

super(C, self) ~A

super(B, self)〜C

super(MyClass, self)不是关于“MyClass的基类”,而是关于MyClass的MRO列表中的下一个类。

正如评论中所述,super(…)实际上并没有返回MRO中的下一个课程,而是委托调用它。