Cuando una subclase necesita personalizar el comportamiento del constructor o cualquier otro método de su clase base, puede utilizar la función super()
para invocar los métodos originales de la clase padre:
class Perro(Animal):
def __init__(self, especie, edad, dueño):
super().__init__(especie, edad) # Llama al constructor de Animal
self.dueño = dueño
def describeme(self):
super().describeme()
print(f"Mi dueño es {self.dueño}.")
Ventajas de usar super():
- Evita duplicación al no tener que reescribir código ya implementado.
- Facilita el mantenimiento.
- Es crucial en herencia múltiple, como veremos a continuación.
Buenas prácticas al usar herencia:
- Evita herencias profundas (más de 3 o 4 niveles), ya que hacen el código difícil de entender y mantener.
- Usa composición en lugar de herencia cuando una clase necesita funcionalidades de otra, pero no representa una relación "es-un".
- No abuses de la herencia múltiple, ya que puede complicar el MRO y provocar errores difíciles de depurar.
- Aplica siempre el principio de responsabilidad única: cada clase debe encargarse de una sola cosa.