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.

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))  # True

Gato 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.