Herança permite que uma classe (a subclasse ou filha) reutilize e estenda os campos e métodos de outra classe (a superclasse ou pai). Ela modela uma relação is-a: um Dog é um Animal.
Herança permite que uma classe (a subclasse ou filha) reutilize e estenda os campos e métodos de outra classe (a superclasse ou pai). Ela modela uma relação is-a: um Dog é um Animal.
class 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 obteve __init__ e eat gratuitamente e adicionou bark. Uma subclasse também pode sobrescrever métodos herdados para alterar o comportamento.
| Benefício | Risco |
|---|---|
| Reutilizar código compartilhado | Acoplamento forte à classe pai |
| Modelar hierarquias reais | Classe base frágil — mudanças no pai quebram filhos |
| Polimorfismo através de um tipo comum | Árvores profundas ficam difíceis de acompanhar |
Uma diretriz comum: favor composição em relação a herança quando a relação é realmente "tem-um", não "é-um".
Herança é o recurso OOP mais mal utilizado: é tentador usá-la apenas para compartilhar código, o que acopla classes não relacionadas.
Usada corretamente — apenas para relações is-a genuínas — ela oferece reutilização mais polimorfismo, permitindo que você trate muitos subtipos uniformemente através de sua classe pai comum.