desmitificar super en python?

Estaba tratando de entender cómo funciona Super en Python y probé el siguiente ejemplo:

class A(object): def __init__(self): print "in A's init" class B(object): def __init__(self): print "in B's init" class C(A,B): def __init__(self): super(C,self).__init__() print "In C" if __name__=="__main__": c=C() 

bastante simple .. Y probé las siguientes súper llamadas (mostradas con los resultados aquí):

 >>> super(B,c).__init__() >>> super(B,c).__init__() >>> super(A,c).__init__() in B's init >>> super(A,c).__init__() in B's init >>> super(A,c).__init__() in B's init >>> super(B,c).__init__() >>> super(C,c).__init__() in A's init 

No entiendo, ¿por qué super(A,c).__init__() imprime que está en el inicio de B?

Super () de Python debería haber sido llamado “next-in-mro” porque no necesariamente llama a un padre; más bien, puede llamar a un hermano en su lugar.

Es fácil inspeccionar el orden de resolución de métodos de su estructura de clase:

  >>> C.__mro__ (, , , ) 

Puedes ver que B es la siguiente clase después de A.

La razón de este diseño es que permite que la cadena de súper llamadas visite cada clase de la cadena no más de una vez. Eso apoya un estilo de progtwigción llamado “herencia múltiple cooperativa” que a veces es muy útil.

Aquí hay algunas referencias que incluyen enlaces al siguiente método de Dylan que sirvió como modelo para el super () de Python: