Dominando Herencia Múltiple, Herencia Multinivel y Orden de Resolución de Métodos (MRO) en Python
Herencia Múltiple en Python
Explora cómo Python soporta herencia múltiple, los matices de la herencia multinivel y cómo el orden de resolución de métodos (MRO) gobierna la búsqueda de atributos.
Herencia Múltiple en Python
Python permite que una clase herede de más de una clase base, igual que C++. Esta característica se conoce como herencia múltiple y permite que una clase derivada combine comportamiento de varias clases padre.
La sintaxis refleja la herencia simple: listar todas las clases padre entre paréntesis, separadas por comas.
Ejemplo
class Base1:
pass
class Base2:
pass
class MultiDerivada(Base1, Base2):
pass
En este ejemplo, MultiDerivada hereda atributos y métodos de tanto Base1 como Base2.

Diagrama: MultiDerivada recibe características de Base1 y Base2.
Herencia Multinivel en Python
Más allá de dos niveles, puedes encadenar herencia: una clase hereda de una clase derivada, creando una jerarquía de herencia multinivel. Python soporta cualquier profundidad.
Cada nueva clase derivada hereda de su padre inmediato, mientras también lleva adelante los atributos del ancestro.
Ejemplo:
class Base:
pass
class Derivada1(Base):
pass
class Derivada2(Derivada1):
pass
Aquí, Derivada1 extiende Base, y Derivada2 extiende Derivada1, formando una cadena de tres niveles.

Orden de Resolución de Métodos (MRO) en Python
Toda clase Python hereda ultimately de object, el tipo base universal. Consecuentemente, todos los objetos son instancias de object, ya sean integrados o definidos por el usuario:
# Salida: True
print(issubclass(list, object))
# Salida: True
print(isinstance(5.5, object))
# Salida: True
print(isinstance("Hola", object))
Cuando la herencia múltiple está involucrada, Python resuelve atributos usando un recorrido depth-first, left-to-right, sin revisitar una clase dos veces. Este orden de recorrido se llama Method Resolution Order (MRO) y garantiza que una clase aparezca antes que sus padres.
El MRO para MultiDerivada es: [MultiDerivada, Base1, Base2, object]. Puedes verlo vía el atributo __mro__ o el método mro():
MultiDerivada.__mro__
# (<class '__main__.MultiDerivada'>, <class '__main__.Base1'>, <class '__main__.Base2'>, <class 'object'>)
MultiDerivada.mro()
# [<class '__main__.MultiDerivada'>, <class '__main__.Base1'>, <class '__main__.Base2'>, <class 'object'>]
Grafos de herencia complejos siguen el mismo principio. Considera este ejemplo:

# Demostración de MRO
class X:
pass
class Y:
pass
class Z:
pass
class A(X, Y):
pass
class B(Y, Z):
pass
class M(B, A, Z):
pass
print(M.mro())
# Salida:
# [<class '__main__.M'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.X'>, <class '__main__.Y'>, <class '__main__.Z'>, <class 'object'>]
Para profundizar en el algoritmo que calcula el MRO, consulta la documentación oficial de Python sobre herencia de clases y la discusión sobre MRO.
python
- Dominando la herencia en C#: Conceptos, tipos y código práctico
- Herencia en C#: Construyendo código reutilizable y mantenible
- Dominando tipos de datos en Python: Guía práctica
- Dominando operadores en Python: Guía completa
- Dominando la sentencia pass en Python: Guía práctica
- Dominando Diccionarios en Python: Creación, Manipulación y Técnicas Avanzadas
- Dominando Excepciones Personalizadas en Python: Guía Práctica
- Dominando la Programación Orientada a Objetos en Python: Clases, Herencia, Encapsulación y Polimorfismo
- Dominando la Herencia en Python: Conceptos, Sintaxis y Ejemplos Prácticos
- Entendiendo type() e isinstance() en Python: ejemplos prácticos
- Programación Orientada a Objetos en Python: Guía Completa y Práctica