python继承和在派生类的父类中使用super()

tam*_*are 6 python multiple-inheritance python-2.7

首先,我不得不为没有更好的头衔而道歉.如果您找到更合适的产品,请随意更改.

基本上,我被Python的多重继承行为所困扰.在我之前的SO问题中,我被指示阅读Python的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 '------------------------'
Run Code Online (Sandbox Code Playgroud)

输出:

check A
------------------------
check A
check B
check C
base check
------------------------
check A
------------------------
check A
check B
------------------------
check A
check B
check C
------------------------
check A
------------------------
check A
------------------------
check A
check B
------------------------
Run Code Online (Sandbox Code Playgroud)

我可以根据观察输出来追踪一个模式,但这让我不理解这个结果背后的基本原理.

我有一些问题,比如,为什么要myview2.check()回来

check A
check B
check C
base check
Run Code Online (Sandbox Code Playgroud)

check A
base check
Run Code Online (Sandbox Code Playgroud)

在我看来,我错过了关于多重继承的关键部分.请为我填补空白.

Chr*_* B. 4

当您调用 时myview2.check(),它会遍历同级,然后调用基类。每当这些遍历之一命中AMixin1BMixin1、 或 时CMixin1,它就会停止,因为这些类不会调用super(..., self).check()

正如 Benn 指出的, Python 官方文档对此进行了描述。如果你仔细想想,它几乎必须以这种方式运作。子类将假设在子类调用之前不会调用基类方法super()。如果是(或者更糟糕的是,如果它取决于其兄弟姐妹的列出顺序),那么事情就会变得非常难以处理。