La herencia múltiple — la posibilidad de que una clase herede de varias clases base a la vez — apareció en Python inspirado por otros lenguajes de programación orientada a objetos (por ejemplo, C++), donde ayuda a crear mixins reutilizables. El desarrollo del mecanismo de búsqueda de métodos (MRO) llevó mucho tiempo para asegurar la predictibilidad en las colisiones de métodos.
Una clase puede recibir métodos con el mismo nombre de diferentes clases base. ¿Cómo determinar qué método utilizar al llamarlo? Sin un esquema claro, esto puede dar lugar a errores difíciles de detectar.
Python implementa el algoritmo MRO (C3 linearization), que define un orden estricto de búsqueda de métodos al resolver conflictos en la jerarquía. Todo se vuelve transparente si se usa la función super() y el método __mro__ de las clases para analizar la cadena de herencia.
Ejemplo de código:
class A: def foo(self): print("A") class B(A): def foo(self): print("B") super().foo() class C(A): def foo(self): print("C") super().foo() class D(B, C): def foo(self): print("D") super().foo() D().foo() print(D.__mro__)
Características clave:
__mro__;¿Qué sucede si los nombres de los métodos parentales coinciden?
Respuesta: La llamada al método se llevará a cabo en el orden definido por MRO. El primer método encontrado con el nombre requerido en la cadena será el que se ejecute.
¿Se puede usar super() sin pasar explícitamente self?
Respuesta: En Python 3 — sí, la llamada super().method() en el cuerpo del método de la clase es equivalente a super(CLASE, self).method(), pero solo dentro de la clase.
¿Se puede cambiar el orden MRO de una clase existente?
Respuesta: El orden MRO es estático después de declarar la clase, pero se puede investigar (o crear una nueva clase con un orden de herencia diferente).
En el proyecto se crearon dos mixins con un método similar, la clase heredera utiliza ambos mixins, pero llama a los métodos directamente por nombre de clase, rompiendo el orden de los acontecimientos.
Pros:
Contras:
Usan super() en cada método de los mixins, lo que garantiza la llamada secuencial, en lugar de omitir el comportamiento necesario.
Pros:
Contras: