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