Módulo 11 - Orientação a objetos: herança
Sobrescrever métodos
11 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026
O que você vai aprender
- Redefinir na filha um método que já existe na base.
- Entender que a versão da filha substitui a da base ao ser chamada.
- Chamar a versão da base com super quando quiser completá-la.
- Ver o polimorfismo simples nascer da sobrescrita.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: Sobrescrever métodos.
Os objetivos desta aula. Redefinir na filha um método que já existe na base. Entender que a versão da filha substitui a da base ao ser chamada. Chamar a versão da base com super quando quiser completá-la. Ver o polimorfismo simples nascer da sobrescrita.
Veja o essencial, parte por parte.
Redefinir o método na filha. Sobrescrever é definir na filha um método com o mesmo nome da base.
Completar a base com super. Substituir por completo: a filha ignora a base e escreve tudo do zero (como falar no cachorro).
Onde o polimorfismo começa. Repare no que a sobrescrita permite: você chama falar sem saber, na hora, se o objeto é um cachorro ou um gato, e mesmo assim sai o som certo.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
Redefinir o método na filha
Herdar dá à filha o comportamento da base. Mas às vezes a filha precisa fazer diferente. Todo animal faz um som, só que cada um faz o seu: o cachorro late, o gato mia. Em vez de inventar nomes diferentes para cada som, o mais elegante é manter um único método, digamos falar, e deixar cada filha dar a sua resposta a ele. Para isso a filha define um método falar com o mesmo nome do da base. Quando você chama falar num cachorro, o Python usa a versão de Cachorro; num gato, a de Gato. Isso é sobrescrever, ou fazer override.
class Animal:
def __init__(self, nome):
self.nome = nome
def falar(self):
return f"{self.nome} faz um som."
class Cachorro(Animal):
def falar(self):
return f"{self.nome} faz au au!"
class Gato(Animal):
def falar(self):
return f"{self.nome} faz miau!"
print(Animal("Bicho").falar()) # Bicho faz um som.
print(Cachorro("Rex").falar()) # Rex faz au au!
print(Gato("Felix").falar()) # Felix faz miau!Cada filha redefine falar; o mesmo nome, três comportamentos.
As três classes têm um método falar, mas cada objeto responde do seu jeito. Lembre da resolução de método da aula sobre a classe filha: ao chamar rex.falar(), o Python procura falar primeiro em Cachorro, encontra ali e para; nunca chega à versão de Animal. Por isso a versão da filha substitui a da base para os objetos dela. A base ainda define um falar genérico, que serve de rede de segurança para qualquer filha que não sobrescreva. Esse é o começo do polimorfismo, que a próxima aula leva mais longe.
Completar a base com super
Sobrescrever não obriga a jogar fora a versão da base. Muitas vezes a filha quer fazer tudo o que a base faz e ainda um pouco mais. Nesse caso, ela chama a versão da base com super().metodo() e completa em seguida. É o mesmo super que você usou no construtor, agora aplicado a outro método. Pense num funcionário e num gerente: o gerente tem a mesma descrição básica do funcionário mais a informação do departamento que chefia. A filha não repete a descrição; ela pede a da base e acrescenta a sua parte.
class Funcionario:
def __init__(self, nome, salario):
self.nome = nome
self.salario = salario
def descricao(self):
return f"{self.nome}, salário R$ {self.salario}"
class Gerente(Funcionario):
def __init__(self, nome, salario, setor):
super().__init__(nome, salario)
self.setor = setor
def descricao(self):
base = super().descricao() # reaproveita a versão da base
return f"{base}, gerente de {self.setor}"
g = Gerente("Ana", 9000, "Vendas")
print(g.descricao()) # Ana, salário R$ 9000, gerente de VendasGerente sobrescreve descricao, mas chama super().descricao() para reaproveitar a base.
Onde o polimorfismo começa
Repare no que a sobrescrita permite: você chama falar sem saber, na hora, se o objeto é um cachorro ou um gato, e mesmo assim sai o som certo. Quem chama não precisa perguntar o tipo nem escrever uma cadeia de condições. O objeto sabe se comportar. Essa é a semente do polimorfismo, a próxima aula. Ela é possível porque toda filha compartilha o mesmo nome de método da base, e cada uma preenche esse nome com o seu comportamento. Nomes iguais na superfície, comportamentos diferentes por baixo.
class Animal:
def __init__(self, nome):
self.nome = nome
def falar(self):
return f"{self.nome} faz um som."
class Vaca(Animal):
def falar(self):
return f"{self.nome} faz muuu!"
def apresentar(animal):
# não pergunta o tipo: confia no método falar
print(animal.falar())
apresentar(Vaca("Mimosa")) # Mimosa faz muuu!
apresentar(Animal("Bicho")) # Bicho faz um som.A função apresentar chama falar sem se importar com o tipo exato do objeto.
A função apresentar não sabe nem se importa se recebeu uma vaca ou um animal genérico; ela só chama falar e confia que cada objeto responde certo. Adicionar um novo tipo de animal, com o seu próprio falar, não obriga a mudar apresentar em nada. Esse desacoplamento é um dos maiores ganhos da orientação a objetos: código que trabalha com a ideia geral, e não com cada caso particular. Guarde o mecanismo: sobrescrever é redefinir o mesmo nome na filha, opcionalmente completando com super, e é ele que abre a porta do polimorfismo.
Teste rápido
O que significa sobrescrever um método na classe filha?
Perguntas frequentes
- Sobrescrever apaga o método da classe base?
- Não. A versão da base continua lá, intacta, e vale para a própria base e para filhas que não sobrescreveram. Sobrescrever só muda qual versão os objetos daquela filha usam. Tanto que a filha pode chamar a versão da base a qualquer momento com super().metodo().
- O método sobrescrito precisa ter os mesmos parâmetros?
- Para o polimorfismo funcionar bem, sim: quem chama espera a mesma forma de uso em todos os tipos. Manter a mesma assinatura, com os mesmos parâmetros, garante que um objeto possa substituir outro sem quebrar o código que os usa. Mudar a assinatura na filha costuma trazer confusão.
- Quando devo chamar super dentro de um método sobrescrito?
- Quando a lógica da base ainda vale e você só quer acrescentar algo. O gerente reaproveita a descrição do funcionário com super().descricao() e soma o setor. Se a filha faz algo totalmente diferente, como o cachorro que late, não há por que chamar super.
- Qual a diferença entre sobrescrever e sobrecarregar?
- Sobrescrever é redefinir na filha um método herdado, com o mesmo nome. Sobrecarregar, em outras linguagens, é ter vários métodos de mesmo nome e parâmetros diferentes na mesma classe. Python não tem sobrecarga clássica; ele resolve variação de argumentos com valores padrão e outros recursos.
- O polimorfismo depende de sobrescrever?
- O polimorfismo por herança nasce da sobrescrita: como cada filha redefine o mesmo método, chamar esse método num objeto qualquer faz o certo para o tipo dele. A próxima aula mostra isso numa lista de objetos variados percorrida por um único laço.
- Posso sobrescrever métodos especiais como __str__?
- Pode, e é bem comum. Sobrescrever __str__ define como o objeto vira texto ao ser impresso, deixando a saída legível. Como __str__ existe na classe base de todos os objetos, redefini-lo na sua classe é um caso cotidiano de sobrescrita, que você aprofunda mais adiante.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.