Herencia

Función super()


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.