Herança e Polimorfismo
Reuso de código e sobrescrita de métodos
Python suporta herança simples e múltipla. Uma subclasse herda todos os atributos e métodos da classe pai. super() referencia a classe pai sem precisar citar o nome explicitamente, tornando o código mais robusto a refatorações.
Python usa MRO (Method Resolution Order) para resolver conflitos em herança múltipla — o algoritmo C3 garante uma ordem consistente e previsível. isinstance() verifica se um objeto é instância de uma classe ou subclasse.
Polimorfismo em Python é baseado em duck typing: "se anda como pato e grasna como pato, é um pato". Não é necessário herança formal para polimorfismo — basta implementar os mesmos métodos.
class Animal:
def __init__(self, nome):
self.nome = nome
def falar(self):
raise NotImplementedError
def __str__(self):
return f"{self.__class__.__name__}({self.nome})"
class Cachorro(Animal):
def falar(self):
return f"{self.nome} diz: Au!"
def buscar(self):
return f"{self.nome} trouxe a bola!"
class Gato(Animal):
def falar(self):
return f"{self.nome} diz: Miau!"
# Polimorfismo
animais = [Cachorro("Rex"), Gato("Whiskers"), Cachorro("Buddy")]
for animal in animais:
print(animal.falar())
# isinstance e issubclass
rex = Cachorro("Rex")
print(isinstance(rex, Cachorro)) # True
print(isinstance(rex, Animal)) # True
print(issubclass(Cachorro, Animal)) # True
# Herança múltipla
class Voador:
def voar(self):
return "voando!"
class Pato(Animal, Voador):
def falar(self):
return "Quack!"
# MRO
print(Pato.__mro__)Prefira composição à herança quando a relação não é claramente "é um tipo de" — herança cria acoplamento forte.