Conceptos Básicos de Python: Programación Orientada a Objetos (OOP)
Herencia Parte 2: super()
Lesson 4 of 7 • 10 XP
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
- Cuando creamos un objeto
Dog, Python ejecuta el método__init__de la claseDog. - En
Dog.__init__, la líneasuper().__init__(name, age)llama aAnimal.__init__. - El constructor padre (
Animal.__init__) asignaself.nameyself.age. - El control vuelve a
Dog.__init__, que luego asignaself.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.