我在玩类,看看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