Aprende Python · lección gratuita

Lección 27 · Herencia y super()

Resumen

La herencia permite crear una clase nueva (la hija o subclase) a partir de otra ya existente (la base, padre o superclase), reutilizando sus atributos y métodos sin reescribirlos. Es uno de los pilares de la programación orientada a objetos: modelamos relaciones del tipo "es un" (un Perro es un Animal).

Conceptos

Cuando una clase hereda de otra, todo lo que define la base queda disponible en la hija. Si la hija no define su propio __init__, se usa el de la base tal cual. Pero normalmente la hija necesita inicializar atributos extra; entonces define su propio __init__ y, dentro, llama a super().__init__(...) para que el padre haga su parte. Así no repetimos la asignación de los atributos que el padre ya gestiona.

class Animal:
    def __init__(self, nombre):
        self.nombre = nombre

    def describir(self):
        return f"{self.nombre} es un animal"

class Perro(Animal):            # Perro hereda de Animal
    def __init__(self, nombre, raza):
        super().__init__(nombre)  # inicializa self.nombre con el padre
        self.raza = raza          # atributo propio de Perro

firulais = Perro("Firulais", "Labrador")
print(firulais.describir())     # método heredado de Animal
print(firulais.raza)            # atributo propio

Sobrescribir un método significa definir en la hija un método con el mismo nombre que el del padre. Cuando llamas a ese método sobre un objeto de la hija, Python usa la versión de la hija (no la del padre). Si dentro de la versión sobrescrita quieres aprovechar lo que ya hacía el padre, lo invocas con super().nombre_del_metodo(...). Esto evita duplicar lógica y mantiene tu código DRY (Don't Repeat Yourself).

class Perro(Animal):
    def describir(self):                       # sobrescribe describir
        base = super().describir()             # reutiliza el del padre
        return f"{base}, concretamente un perro"

Ejemplos

# 1. Constructor de la hija que extiende al de la base
class Vehiculo:
    def __init__(self, marca):
        self.marca = marca

class Coche(Vehiculo):
    def __init__(self, marca, puertas):
        super().__init__(marca)   # el padre asigna self.marca
        self.puertas = puertas    # atributo nuevo

c = Coche("Toyota", 4)
print(c.marca, c.puertas)         # Toyota 4

# 2. Sobrescribir un método por completo
class Animal:
    def sonido(self):
        return "..."

class Gato(Animal):
    def sonido(self):             # versión propia
        return "Miau"

print(Gato().sonido())            # Miau

# 3. Sobrescribir reutilizando al padre con super()
class Empleado:
    def __init__(self, nombre):
        self.nombre = nombre
    def saludo(self):
        return f"Hola, soy {self.nombre}"

class Jefe(Empleado):
    def saludo(self):
        return super().saludo() + " y soy el jefe"

print(Jefe("Ana").saludo())       # Hola, soy Ana y soy el jefe

# 4. Comprobar relaciones de herencia
print(isinstance(Gato(), Animal)) # True
print(issubclass(Jefe, Empleado)) # True
💡 Llama siempre a super().__init__(...) al principio del constructor de la hija. Así garantizas que los atributos de la base existan antes de usarlos, y evitas duplicar código de inicialización.

Cheatsheet

SintaxisQué hace
class Hija(Base):Declara que Hija hereda de Base
super().__init__(args)Llama al constructor de la clase base
super().metodo(args)Llama a un método de la base desde la hija
def metodo(self): (en la hija)Sobrescribe el método heredado
isinstance(obj, Clase)True si obj es de Clase o subclase
issubclass(Hija, Base)True si Hija desciende de Base

---

← Métodos y selfMétodos especiales (dunder) →

Ver todas las lecciones de Aprende Python →