2016-07-20 3 views
0

Я недавно была проблема понимания код ниже: Python супер() в гнездовой множественного наследования

class A(object): 
    def __init__(self): 
     print("go A go!") 

class B(A): 
    def __init__(self): 
     super(B, self).__init__() 
     print("go B go!") 

class C(A): 
    def __init__(self): 
     super(C, self).__init__() 
     print("go C go!") 


class D(B,C): 
    def __init__(self): 
     super(D, self).__init__() 
     print("go D go!") 
d = D() 

В результате я получил это:

go A go! 
go C go! 
go B go! 
go D go! 

Я понимаю, использование супер () в простом множественном наследовании, но я действительно не знаю, как он получил этот результат.

ответ

3

Для определения заказа Python использует C3 linearlization (Order Resolution Method). Он производится в следующем порядке:

D.__mro__ 
(__main__.D, __main__.B, __main__.C, __main__.A, builtins.object) 

Поскольку вы звоните супер первый и печать, это приводит к печати в обратном порядке (по аналогии называть порядок в рекурсии)