Conceitos Básicos de Python: Programação Orientada a Objetos (OOP)
Herança Parte 2: super()
Lesson 4 of 7 • 10 XP
Keep your place in this quest
Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.
Quando uma classe herda de uma classe pai, a classe filha pode ter suas próprias variáveis de instância e métodos, mas às vezes ainda precisa usar partes do código do pai.
É aí que entra a função super().
Ela permite que a classe filha acesse métodos (e indiretamente atributos) da sua classe pai — sem precisar codificar o nome do pai explicitamente.
Um dos usos mais comuns de super() é chamar o construtor do pai (__init__) de dentro da classe filha, para que o pai possa configurar seus próprios atributos antes que a filha adicione novos.
Quando você cria uma classe filha que define seu próprio método init, ela sobrescreve o init do pai. Isso significa que quando você cria um objeto da classe filha, apenas o init da filha será executado — o construtor do pai não será chamado automaticamente. Como resultado, qualquer lógica de configuração, valores padrão ou atributos definidos no init do pai serão completamente ignorados, ficando indefinidos no objeto da filha. Isso pode causar erros inesperados se sua classe pai era responsável por inicializações importantes. Para evitar isso, você deve chamar super().init() dentro do construtor da filha, que executa explicitamente a inicialização do pai antes de adicionar ou sobrescrever qualquer coisa na filha.
Vamos explorar isso agora!
Por que Usar super().__init__()?
Quando você cria uma subclasse, pode querer adicionar dados extras para armazenar.
No entanto, você ainda quer que os atributos do pai sejam inicializados corretamente. Em vez de reescrever o código de inicialização do pai, você simplesmente o chama usando super().__init__().
Exemplo: Adicionando um Novo Atributo em uma Subclasse
Vamos supor que temos uma classe Animal que armazena name e age.
Queremos fazer uma subclasse Dog que também armazena a breed do cachorro (seu tipo), mas ainda queremos usar o construtor de Animal para definir name e age.
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
class Dog(Animal):
def __init__(self, name, age, breed):
super().__init__(name, age) # Chama o construtor de Animal
self.breed = breed # Adiciona o atributo próprio de Dog
Como Isso Funciona Passo a Passo
- Quando criamos um objeto
Dog, o Python executa o método__init__da classeDog. - Dentro de
Dog.__init__, a linhasuper().__init__(name, age)chamaAnimal.__init__. - O construtor do pai (
Animal.__init__) defineself.nameeself.age. - O controle volta para
Dog.__init__, que então defineself.breed.
Dessa forma:
- Os atributos do pai são inicializados exatamente como o pai planejou.
- A classe filha pode adicionar seus próprios atributos sem duplicar código.
Usando a Classe
dog = Dog("Rex", 4, "Golden Retriever")
print(dog.name) # Rex
print(dog.age) # 4
print(dog.breed) # Golden Retriever
Por que super() É Melhor do que Chamar o Pai pelo Nome
Você poderia chamar Animal.__init__(self, name, age) diretamente, mas usar super() é mais flexível:
- Ele lida automaticamente com herança múltipla (se sua classe herdar de mais de um pai).
- Facilita a manutenção do código — se você renomear a classe pai, não precisa mudar todas as referências.
- Comunica claramente que você está chamando intencionalmente um método da classe pai.
DICA: Sempre chame `super().__init__()` antes de definir os atributos próprios da filha, para garantir que todos os atributos do pai estejam prontos para uso.
Conclusão
super() é sua ligação com a classe pai.
Use-o quando quiser:
- Reutilizar o código de configuração do pai.
- Estender a funcionalidade do pai sem duplicá-la.
- Manter seu código limpo, fácil de manter e preparado para mudanças na hierarquia de classes.
Na próxima lição, exploraremos métodos e variáveis privadas — uma forma de proteger os dados internos da sua classe contra acesso ou modificação externa.