A veces, necesitamos que una clase combine funcionalidades de varias otras clases. Por ejemplo, en una app de animales y vehículos, podríamos querer que algunos objetos puedan volar, nadar o caminar. ¿Cómo darle varias habilidades sin repetir código?
La herencia múltiple es la solución, aunque con algunos retos. Afortunadamente, Python nos ofrece herramientas flexibles para manejarlo de manera ordenada.
¿Qué es la herencia múltiple?
Cuando una clase hereda de otra, recibe automáticamente sus atributos y métodos. Es como si dijéramos: "esta nueva clase es una versión extendida de otra existente".
En herencia múltiple, podemos heredar de varias clases al mismo tiempo
Vamos con un ejemplo real:
class A:
def saludar(self):
print("Hola desde A")
class B:
def despedir(self):
print("Chao desde B")
class C(A, B):
pass
c = C()
c.saludar() # Hola desde A
c.despedir() # Chao desde B
Aquí, la clase C hereda de A y B. Eso le permite a sus objetos acceder a los métodos de ambas clases.
¿Y qué pasa si hay métodos con el mismo nombre?
Imagina que tanto A como B tienen un método llamado saludar(). ¿Cuál se ejecuta? Aquí entra en juego MRO, el orden de resolución de métodos .
Python tiene una forma clara de decidir qué método usar según el orden en que se listan las clases padre:
class A:
def saludar(self):
print("Hola desde A")
class B:
def saludar(self):
print("Hola desde B")
class C(A, B):
pass
c = C()
c.saludar() # ¿Cuál se ejecuta?
En este caso, se ejecuta el método de A, porque fue listado primero: class C(A, B).
Podemos ver el orden con el método .mro():
print(C.mro())
# [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
Entonces, Python prioriza a A sobre B.
¿Qué son los mixins?
En la práctica, a menudo no necesitamos toda la funcionalidad de una clase, sino solo comportamientos específicos y reutilizables.
Ejemplo de mixin:
class ImprimibleMixin:
def imprimir_info(self):
print(self.__dict__)
class Persona(ImprimibleMixin):
def __init__(self, nombre, edad):
self.nombre = nombre
self.edad = edad
p = Persona("Camilo", 30)
p.imprimir_info()
# {'nombre': 'Camilo', 'edad': 30}
Aquí, ImprimibleMixin agrega al objeto Persona la capacidad de imprimir sus atributos internos, sin ser parte de una jerarquía compleja.
Casos prácticos: pato y avión
Imagina que necesitamos modelar objetos con distintos comportamientos, sin repetir código. Vamos a usar mixins para añadir capacidades de moverse.
class VolarMixin:
def volar(self):
print("Volando")
class NadarMixin:
def nadar(self):
print("Nadando")
class CaminarMixin:
def caminar(self):
print("Caminando")
class Pato(VolarMixin, NadarMixin, CaminarMixin):
def hacer_sonido(self):
print("Cuac")
class Avion(VolarMixin):
def repostar_combustible(self):
print("Repostando combustible")
Ahora veamos cómo se comportan estos objetos:
pato = Pato()
avion = Avion()
pato.volar() # Volando
pato.nadar() # Nadando
pato.caminar() # Caminando
pato.hacer_sonido() # Cuac
avion.volar() # Volando
avion.repostar_combustible() # Repostando combustible
¿Qué vemos en este ejemplo?
- Ambos objetos (
PatoyAvion) pueden volar gracias al mixinVolarMixin. - El
Patopuede hacer más cosas porque usamos más mixins (NadarMixinyCaminarMixin). - Esto es una forma clara de aplicar la herencia múltiple sin complicar la jerarquía de clases.
Mejores prácticas
Aunque Python permite heredar de múltiples clases sin problema, lo recomendable es:
- Usar herencia múltiple solo cuando hay una relación lógica entre clases.
- Evitar heredar solo para “tomar prestado” uno o dos métodos.
- Preferir el uso de mixins para añadir funciones reutilizables en muchas clases.
Resumen
- Python permite heredar de varias clases al mismo tiempo: esto se llama herencia múltiple.
- El orden de búsqueda de métodos en herencia múltiple se define por el MRO (Method Resolution Order).
- Cuando se repiten métodos en varias clases padre, Python sigue el orden de definición para decidir cuál ejecutar.
- Un mixin es una clase diseñada para ser usada junto con otras clases, añadiendo funciones específicas.
- Es importante no abusar de la herencia múltiple; usa mixins cuando solo necesitas agregar funcionalidades específicas.
Para acceder completo a curso necesitas un plan básico
El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.