Error de orden de resolución del método
-
12-12-2019 - |
Pregunta
Esto es más una cuestión de curiosidad que un problema serio:
Estaba jugando con la herencia múltiple y me encontré con esto:
>>> class A(object):
... def __init__(self): print "A.__init__() called"
...
>>> class B(object, A): pass
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Cannot create consisten method resolution
order (MRO) for bases object, A
Yo tengo un TypeError
.Sin embargo, cuando invierto el orden de la herencia múltiple:
>>> class B(A, object): pass
>>> b = B()
A.__init__() called
Funciona bien.Supuse que en primera instancia, la herencia de object
antes A
crea algún tipo de ambigüedad en el nombre.¿A alguien le importaría explicar qué está pasando aquí?
Solución
A
se hereda de object
o subclase de object
, no funciona.El MRO garantiza que las bases más a la izquierda se visitan antes que las de la derecha, pero también garantiza que entre los ancestros, si x es una subclase de y, entonces x se visita antes que y.Es imposible satisfacer ambas garantías en este caso.
Aquí hay una pregunta similar
Pitón:Problema con metaclases en conjunto con herencia múltiple.