关于python MRO和super()的行为

2024-04-20 09:39:53 发布

您现在位置:Python中文网/ 问答频道 /正文

今天我试图弄清楚__mro__和super是如何在python中工作的,我发现了一些有趣而又奇怪的东西,因为我在阅读__mro__之后得到了一些我不理解的东西。下面是代码片段。你知道吗

代码段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中更新我的super时:

#!/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一起工作的吗?你知道吗


Tags: totestselfreturnbinobjectusrdef
1条回答
网友
1楼 · 发布于 2024-04-20 09:39:53

D的MRO是[D,B,C,A,object]。你知道吗

super(C, self)~A

super(B, self)~C

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

如注释中所述,super(…)实际上并不返回MRO中的下一个类,而是将调用委托给它。你知道吗

相关问题 更多 >