La herencia permite que una clase (subclase o hijo) reutilice y extienda los campos y métodos de otra clase ( o ). Modela una relación : un .
DogAnimalclass Animal:
def __init__(self, name):
self.name = name
def eat(self):
return f"{self.name} is eating"
class Dog(Animal): # Dog inherits everything from Animal
def bark(self): # ...and adds new behavior
return "Woof!"
d = Dog("Rex")
print(d.eat()) # "Rex is eating" → inherited, not rewritten
print(d.bark()) # "Woof!" → Dog-specific
Dog obtuvo __init__ y eat de forma gratuita y agregó bark. Una subclase también puede anular métodos heredados para cambiar el comportamiento.
| Beneficio | Riesgo |
|---|---|
| Reutilizar código compartido | Acoplamiento estrecho con la clase padre |
| Modelar jerarquías reales | Clase base frágil: los cambios del padre rompen los hijos |
| Polimorfismo a través de un tipo común | Los árboles profundos se vuelven difíciles de seguir |
Una directriz común: favorecer la composición sobre la herencia cuando la relación es realmente "has-a", no "is-a".
La herencia es la característica de OOP más mal utilizada: es tentador usarla solo para compartir código, lo que acopla clases no relacionadas.
Usada correctamente —solo para relaciones is-a genuinas— te proporciona reutilización más polimorfismo, permitiéndote tratar muchos subtipos de manera uniforme a través de su padre común.