Алмазное наследование python и использование super() в родителях производного класса

Прежде всего, я должен извиниться за то, что у меня нет лучшего названия. Не стесняйтесь менять его, если найдете более подходящий.

По сути, меня раздражало поведение множественного наследования в 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 '------------------------'

Выводы:

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
------------------------

Я могу проследить закономерность, основываясь на наблюдениях за выводами, но меня раздражает непонимание логики этого результата.

У меня есть такие вопросы, как, например, почему myview2.check()возвращает

check A
check B
check C
base check

, а не

check A
base check

Мне кажется, что я упускаю ключевую часть о множественном наследовании. Пожалуйста, заполните пробел для меня.

6
задан Community 23 May 2017 в 12:22
поделиться