1

我在玩类,看看mro在 python3 中是如何工作的。我得到了主要想法:方法从左到右解析,深度优先,如果有一个共同的父级,它就在最后。

这显然很简单,但不像我期望的那样:

class A(object):
    def f(self):
        print("calling A")
        print("A")


class B(A):
    def f(self):
        print("calling B")
        super(B, self).f()
        print("B")


class C(A):
    def f(self):
        print("calling C")
        super(C, self).f()
        print("C")


class D(B,C):
    def f(self):
        print("calling D")
        super(D, self).f()
        print("D")

d=D()
d.f()

现在,由于D -> B -> C -> A我希望super调用mroB.f以便它打印:

calling D
calling B
calling A
A
B
D

但它实际上C.f也调用:

calling D
calling B
calling C
calling A
A        
C        
B        
D        

这是为什么?

我希望C.f不被调用的原因是因为B作为方法f,解析应该停止。如果C不继承自,就是这种情况A

class A(object):
    def f(self):
        print("calling A")
        print("A")


class B(A):
    def f(self):
        print("calling B")
        super(B, self).f()
        print("B")


class C():
    def f(self):
        print("calling C")
        super(C, self).f()
        print("C")


class D(B,C):
    def f(self):
        print("calling D")
        super(D, self).f()
        print("D")

d=D()
d.f()
# prints:
# calling D
# calling B
# calling A
# A        
# B        
# D        
4

1 回答 1

1

我认为重要的是要提到它super不称为“父类”,而是“MRO 中的下一个类”。

您自己说过,MRO 是D -> B -> C -> A针对D. 所以superin D.fwill resolve to Bsuperin B.fwill resolve to C,最后superin C.fwill resolve to A

如果您需要更多信息,可以使用多种资源(对 的有用性有不同的解释super):

于 2017-04-05T17:30:27.547 回答