¿Por qué es esto un MRO ambiguo?

class First(object): def __init__(self): print "first" class Second(First): def __init__(self): print "second" class Third(First, Second): def __init__(self): print "third" 

Fuente

¿Por qué no puede Python crear un MRO consistente? Me parece que está bastante claro:

  1. Buscar en primero si el método no existe en tercero
  2. Buscar en segundo si el método no existe en primero

Pero si lo pruebas:

 TypeError: Error when calling the metaclass bases Cannot create a consistent method resolution order (MRO) for bases First, Second 

Para ser “consistente”, el MRO debería satisfacer estas restricciones:

  1. Si una clase se hereda de varias superclases, las que figuran anteriormente en la lista de superclases deberían aparecer antes en la MRO que las que se enumeran más adelante.
  2. Cada clase en el MRO debe venir antes de cualquiera de sus superclases.

Su jerarquía propuesta no tiene ningún orden posible que cumpla con estas restricciones. Debido a que Tercero se define para heredar de Primero antes de Segundo, Primero debe aparecer antes del Segundo en el MRO. Pero porque Second hereda de First, Second debe aparecer antes de First en el MRO. Esta contradicción no puede ser reconciliada.

Puede leer más sobre el método preciso que Python utiliza para calcular el MRO, que se denomina algoritmo de linealización C3 .