¿Qué imprime esto?
class A:
def hi(self): return "A"
class B(A):
def hi(self): return "B"
class C(A):
def hi(self): return "C"
class D(B, C):
pass
print(D().hi(), [k.__name__ for k in D.__mro__])Opciones
- B ['D', 'B', 'C', 'A', 'object'] (Opción correcta)
- C ['D', 'C', 'B', 'A', 'object']
- B ['D', 'B', 'A', 'C', 'object']
- A ['D', 'A', 'B', 'C', 'object']
Respuesta
B ['D', 'B', 'C', 'A', 'object']
Por qué
Cuando una clase tiene varios padres, Python necesita un orden fijo para buscar métodos. Ese orden es el MRO (Method Resolution Order).
Python lo construye con un algoritmo llamado C3: primero la propia clase, luego los padres de izquierda a derecha, y un abuelo compartido (A) solo después de todos sus hijos.
Para D eso es D, B, C, A, object. B es la primera clase con hi(), así que imprime B.
Recuerda
Python busca en los padres de izquierda a derecha; revisa el orden con Class.__mro__.