我是 MRO 的新手,在弄清楚这些输出的逻辑时遇到了问题。
情况1:
class A(object):
def save(self):
print "A"
class B(A):
def save(self):
print "B"
super(B, self).save()
class C(A):
def save(self):
print "C"
super(C, self).save()
class D(C, B):
def save(self):
print "D"
super(D,self).save()
D().save()
输出:
D
C
B
A
我的问题是如何super(C)
调用B.save()
.
根据 MRO:super(C, self)
不是关于“基类C
”,而是关于 .MRO 列表中的下一个类C
。但是B
在 MRO 列表中没有C
.
案例二:
class A(object):
def save(self):
print "A"
class B(A):
def save(self):
print "B"
super(B, self).save()
class C(A):
def save(self):
print "C"
# removed super call here
class D(C, B):
def save(self):
print "D"
super(D,self).save()
D().save()
输出:
D
C
案例3:
class A(object):
def save(self):
print "A"
class B(object):
#inherits object now instead of A
def save(self):
print "B"
super(B, self).save()
class C(A):
def save(self):
print "C"
super(C, self).save()
class D(C, B):
def save(self):
print "D"
super(D,self).save()
D().save()
输出:
D
C
A
问题
如果B
不是从 继承A
,而是object
直接继承,MRO 会受到怎样的影响?
有人可以解释这背后的原因吗?