首先,我不得不为没有更好的标题而道歉。如果你找到一个更合适的,可以随意改变它。在
基本上,我被Python的多重继承行为所困扰。在我的previous SO question中,我被指示阅读Python's C3 MRO。这确实有助于我更好地理解Python中的多重继承。就在我以为我掌握了它的时候,我遇到了下面的场景,我似乎搞不懂。在
class UltimateBase(object):
def check(self):
print 'base check'
class AMixin1(UltimateBase):
def check(self):
print 'check A'
class BMixin1(UltimateBase):
def check(self):
print 'check B'
class CMixin1(UltimateBase):
def check(self):
print 'check C'
class AMixin2(UltimateBase):
def check(self):
print 'check A'
return super(AMixin2, self).check()
class BMixin2(UltimateBase):
def check(self):
print 'check B'
return super(BMixin2, self).check()
class CMixin2(UltimateBase):
def check(self):
print 'check C'
return super(CMixin2, self).check()
class MyView1(AMixin1, BMixin1, CMixin1):
pass
class MyView2(AMixin2, BMixin2, CMixin2):
pass
class MyView3(AMixin1, BMixin2, CMixin2):
pass
class MyView4(AMixin2, BMixin1, CMixin2):
pass
class MyView5(AMixin2, BMixin2, CMixin1):
pass
class MyView6(AMixin1, BMixin1, CMixin2):
pass
class MyView7(AMixin1, BMixin2, CMixin1):
pass
class MyView8(AMixin2, BMixin1, CMixin1):
pass
myview1 = MyView1()
myview2 = MyView2()
myview3 = MyView3()
myview4 = MyView4()
myview5 = MyView5()
myview6 = MyView6()
myview7 = MyView7()
myview8 = MyView8()
myview1.check()
print '------------------------'
myview2.check()
print '------------------------'
myview3.check()
print '------------------------'
myview4.check()
print '------------------------'
myview5.check()
print '------------------------'
myview6.check()
print '------------------------'
myview7.check()
print '------------------------'
myview8.check()
print '------------------------'
输出:
^{pr2}$我可以根据观察结果找出一个模式,但它让我无法理解这个结果背后的基本原理。在
我有一些问题,例如,myview2.check()
为什么返回
check A
check B
check C
base check
不是
check A
base check
在我看来,我遗漏了一个关于多重继承的关键部分。请帮我填补这个空缺。在
当您调用},它就会停止,因为这些类不调用{}。在
myview2.check()
时,它遍历同级,然后调用基类。每当其中一个遍历命中AMixin1
、BMixin1
、或{正如Benn指出的,这在official Python documentation中描述。如果你仔细想想,它基本上是这样工作的。子类将假定在子类调用
super()
之前没有调用基类方法。如果是(或者,更糟的是,它取决于它的兄弟姐妹被列出的顺序),这会使事情变得很难处理。在试着让我的头转向同一个问题。 我发现以下代码有助于简化问题:
(基本上,当一个类的所有
super
都被命中时,该类就会被调用。)输出:
^{pr2}$Try Online
相关问题 更多 >
编程相关推荐