Módulo 11 - Orientação a objetos: herança
Criando uma classe filha
10 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026
O que você vai aprender
- Escrever a sintaxe class Filha(Base) corretamente.
- Confirmar que a filha herda atributos e métodos da base.
- Acrescentar novos atributos e métodos na filha.
- Entender como o Python procura um método da filha para a base.
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: Criando uma classe filha.
Os objetivos desta aula. Escrever a sintaxe class Filha(Base) corretamente. Confirmar que a filha herda atributos e métodos da base. Acrescentar novos atributos e métodos na filha. Entender como o Python procura um método da filha para a base.
Veja o essencial, parte por parte.
A sintaxe da classe filha. Para herdar, escreva o nome da base entre parênteses: class Filha(Base).
Acrescentando o que é próprio da filha. felix entende comer (da base Animal) e miar (próprio de Gato).
Como o Python encontra o método. Quando você escreve felix.comer(), o Python faz uma busca ordenada.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
A sintaxe da classe filha
A herança em Python cabe em um detalhe de sintaxe: você coloca o nome da classe base entre parênteses logo depois do nome da filha. Onde antes você escrevia class Cachorro:, agora escreve class Cachorro(Animal):. Esse par de parênteses é o que diz ao Python que Cachorro deve reaproveitar tudo de Animal. Sem os parênteses, Cachorro seria uma classe independente, sem nenhuma ligação com Animal. Com eles, a ligação está feita e a herança acontece.
class Veiculo:
def __init__(self, marca):
self.marca = marca
def ligar(self):
return f"{self.marca} ligado."
class Carro(Veiculo):
def buzinar(self):
return "Bi bi!"
meu = Carro("Fiat")
print(meu.marca) # Fiat
print(meu.ligar()) # Fiat ligado.
print(meu.buzinar()) # Bi bi!Carro(Veiculo) herda marca e ligar, e adiciona buzinar.
O objeto meu foi criado como Carro, mas responde a marca e a ligar sem que Carro tenha definido nenhum dos dois; os dois vieram de Veiculo. E buzinar, que é próprio de Carro, também funciona. Repare que nem sequer escrevemos um __init__ em Carro: como a filha não define o seu próprio construtor, o Python usa o da base. Por isso Carro("Fiat") funciona e o atributo marca é criado. Na próxima aula você aprende a estender esse construtor quando a filha precisar de dados a mais.
Acrescentando o que é próprio da filha
A filha não fica presa ao que a base oferece. Ela pode acrescentar quantos métodos quiser, e cada filha pode acrescentar coisas diferentes. É assim que duas classes que herdam da mesma base se especializam em direções distintas. No exemplo abaixo, tanto Gato quanto Passaro herdam de Animal, ganhando nome e comer, mas cada um define o seu próprio comportamento: o gato mia e o pássaro voa. A base concentra o comum; as filhas concentram a diferença.
class Animal:
def __init__(self, nome):
self.nome = nome
def comer(self):
return f"{self.nome} comeu."
class Gato(Animal):
def miar(self):
return f"{self.nome}: miau"
class Passaro(Animal):
def voar(self):
return f"{self.nome} voou."
felix = Gato("Felix")
blu = Passaro("Blu")
print(felix.comer(), felix.miar()) # Felix comeu. Felix: miau
print(blu.comer(), blu.voar()) # Blu comeu. Blu voou.Duas filhas da mesma base, cada uma com o seu método próprio.
Como o Python encontra o método
Quando você escreve felix.comer(), o Python faz uma busca ordenada. Ele olha primeiro na classe do objeto, que é Gato. Não achou comer ali, então sobe para a classe base, Animal, e encontra. Se também não achasse em Animal, continuaria subindo até acabar a cadeia e, aí sim, daria um erro de atributo. Essa ordem, da classe mais específica para a mais geral, chama-se resolução de método. Você não precisa decorar o mecanismo agora, mas entender que a busca vai da filha para a base explica por que a filha pode redefinir um método da base, tema da aula sobre sobrescrever.
class Animal:
def comer(self):
return "Animal comendo"
class Gato(Animal):
pass # não define nada; herda tudo
felix = Gato()
print(felix.comer()) # Animal comendo
print(isinstance(felix, Gato)) # True
print(isinstance(felix, Animal)) # TrueGato vazio herda comer de Animal; felix é dos dois tipos ao mesmo tempo.
O último trecho revela algo importante: um Gato é, ao mesmo tempo, um Animal. A função isinstance confirma que felix é instância de Gato e também de Animal, exatamente a relação é-um da aula anterior, agora visível em código. Essa dupla identidade é o que torna possível o polimorfismo, que você verá adiante: como todo Gato é um Animal, qualquer trecho que espere um Animal aceita um Gato. Por enquanto, fixe a mecânica: parênteses com a base para herdar, métodos novos na filha para especializar, e busca da filha para a base ao chamar.
Teste rápido
O que a linha class Carro(Veiculo): faz?
Perguntas frequentes
- Preciso escrever um __init__ na classe filha?
- Só se a filha precisar de dados diferentes da base. Se você não define um __init__ na filha, o Python usa o da base automaticamente. Quando a filha precisa de atributos a mais, você escreve o seu próprio __init__ e chama o da base com super, tema da próxima aula.
- Uma classe pode herdar de mais de uma base?
- Pode; chama-se herança múltipla e usa vírgula entre as bases, como class C(A, B). É um recurso poderoso e menos comum, que exige cuidado com a ordem de resolução. No dia a dia, a herança de uma base só resolve a maioria dos casos, e é onde este módulo foca.
- O que acontece se eu chamar um método que não existe?
- O Python procura na classe do objeto, depois nas bases, e se não achar em lugar nenhum levanta um AttributeError. A mensagem diz que o objeto não tem aquele atributo. É o sinal de que o método não foi definido na filha nem herdado da base.
- O que a função isinstance verifica?
- Ela responde se um objeto é de um tipo, considerando a herança. Como todo Gato é um Animal, isinstance(felix, Animal) é True mesmo felix sendo um Gato. É a forma correta de checar o tipo respeitando a relação é-um, melhor que comparar type() diretamente.
- A palavra pass no meio da classe faz o quê?
- pass é um marcador que não faz nada, usado onde o Python exige um corpo mas você não tem nada a escrever. Numa classe filha vazia, ela apenas herda tudo da base. Você troca o pass por métodos assim que tiver algo próprio a acrescentar.
- A ordem em que declaro base e filha importa?
- Sim: a classe base precisa já estar definida no ponto em que a filha a menciona. Por isso escreva a base antes da filha no arquivo. Se a filha aparecer antes, o Python não encontra o nome da base e levanta um erro de nome.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.