Keep your place in this quest

Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.

Cuando una clase hereda de una clase padre, la clase hija puede tener sus propias variables de instancia y métodos, pero a veces todavía necesita usar partes del código del padre.

Aquí es donde entra la función super().
Permite que la clase hija acceda a métodos (e indirectamente a atributos) de su clase padre — sin tener que codificar el nombre del padre directamente.

Uno de los usos más comunes de super() es llamar al constructor del padre (__init__) desde dentro de la clase hija, para que el padre pueda configurar sus propios atributos antes de que la hija añada los suyos nuevos.

Cuando creas una clase hija que define su propio método init, este sobrescribe el init del padre. Esto significa que cuando creas un objeto de la clase hija, solo se ejecutará el init de la hija — el constructor del padre no se llamará automáticamente. Como resultado, cualquier lógica de configuración, valores por defecto o atributos definidos en el init del padre se omitirán por completo, quedando indefinidos en el objeto hijo. Esto puede causar errores inesperados si tu clase padre era responsable de una inicialización importante. Para evitar perder ese comportamiento, debes llamar a super().init() dentro del constructor de la hija, lo que ejecuta explícitamente la inicialización del padre antes de añadir o sobrescribir algo en la hija.

¡Vamos a explorar eso ahora!


¿Por qué usar super().__init__()?

Cuando creas una subclase, puede que le añadas datos extra para almacenar.
Sin embargo, aún quieres que los atributos del padre se inicialicen correctamente. En lugar de reescribir el código de inicialización del padre, simplemente lo llamas usando super().__init__().

Ejemplo: Añadir un nuevo atributo en una subclase

Digamos que tenemos una clase Animal que guarda name y age.
Queremos hacer una subclase Dog que también almacene la breed del perro (su raza), pero aún queremos usar el constructor de Animal para configurar name y age.

class Animal:
    def __init__(self, name, age):
        self.name = name
        self.age = age

class Dog(Animal):
    def __init__(self, name, age, breed):
        super().__init__(name, age)  # Llama al constructor de Animal
        self.breed = breed           # Añade el atributo propio de Dog

Cómo funciona paso a paso

  1. Cuando creamos un objeto Dog, Python ejecuta el método __init__ de la clase Dog.
  2. En Dog.__init__, la línea super().__init__(name, age) llama a Animal.__init__.
  3. El constructor padre (Animal.__init__) asigna self.name y self.age.
  4. El control vuelve a Dog.__init__, que luego asigna self.breed.

De esta manera:

  • Los atributos del padre se inicializan exactamente como el padre quería.
  • La clase hija puede añadir sus propios atributos sin duplicar código.

Usando la clase

dog = Dog("Rex", 4, "Golden Retriever")

print(dog.name)   # Rex
print(dog.age)    # 4
print(dog.breed)  # Golden Retriever

Por qué super() es mejor que llamar al padre por su nombre

Podrías llamar directamente a Animal.__init__(self, name, age), pero usar super() es más flexible:

  • Maneja automáticamente la herencia múltiple (si tu clase hereda de más de un padre).
  • Hace que tu código sea más fácil de mantener — si cambias el nombre de la clase padre, no tienes que cambiar todas las referencias.
  • Comunica claramente que estás llamando intencionadamente a un método de la clase padre.
CONSEJO: Siempre llama a `super().__init__()` antes de asignar los atributos propios de la hija, para que todos los atributos del padre estén listos para usar.

Para finalizar

super() es tu conexión con la clase padre. Úsalo cuando quieras:

  • Reutilizar el código de configuración del padre.
  • Extender la funcionalidad del padre sin duplicarla.
  • Mantener tu código limpio, mantenible y preparado para cambios en la jerarquía de clases.

En la próxima lección, exploraremos métodos y variables privadas — una forma de proteger los datos internos de tu clase para que no sean accedidos o modificados desde el exterior.