Aprende Python · lección gratuita
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).
class Hija(Base): — entre paréntesis va la clase de la que heredas.super().__init__(...) llamas al constructor de la clase base para inicializar lo que ella ya sabe inicializar.super() también sirve para reutilizar el método del padre dentro del método sobrescrito, sin duplicar código.isinstance(obj, Clase) y issubclass(Hija, Base).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"
# 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.
| Sintaxis | Qué 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 |
---