Módulo 10 - Orientação a objetos: classes
O método __init__ e o self
11 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026
O que você vai aprender
- Entender o __init__ como o construtor, chamado ao criar o objeto.
- Compreender o que é o self e por que ele vem primeiro nos métodos.
- Guardar atributos de instância com self.atributo dentro do __init__.
- Passar dados na criação do objeto, como Conta('Ana', 500).
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: O método __init__ e o self.
Os objetivos desta aula. Entender o __init__ como o construtor, chamado ao criar o objeto. Compreender o que é o self e por que ele vem primeiro nos métodos. Guardar atributos de instância com self.atributo dentro do __init__. Passar dados na criação do objeto, como Conta('Ana', 500).
Veja o essencial, parte por parte.
__init__, o construtor. __init__ é o construtor: o Python o chama sozinho quando você cria o objeto.
O que é o self. Nos métodos, self é sempre o objeto atual, aquele antes do ponto na chamada.
Atributos de instância. Os dados que você guarda com self.algo = valor dentro do __init__ chamam-se atributos de instância.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
__init__, o construtor
Na aula anterior os objetos nasciam vazios. Para que cada conta já venha com titular e saldo, a classe ganha um método especial chamado __init__, com dois sublinhados antes e dois depois do nome. Ele é o construtor: o Python o executa automaticamente toda vez que você cria um objeto, sem você chamar nada. É o lugar de preparar o estado inicial da instância. Os parênteses vazios de Conta() dão lugar a Conta('Ana', 500), e esses valores chegam ao __init__.
class Conta:
def __init__(self, titular, saldo):
self.titular = titular
self.saldo = saldo
conta_ana = Conta("Ana", 500)
print(conta_ana.titular) # Ana
print(conta_ana.saldo) # 500O __init__ recebe titular e saldo e os guarda no objeto com self.
Ao escrever Conta('Ana', 500), o Python cria um objeto novo e chama __init__ passando esse objeto como self e os valores 'Ana' e 500 como titular e saldo. Dentro do método, self.titular = titular grava o nome dentro do objeto, e self.saldo = saldo grava o valor. A partir daí, conta_ana.titular vale 'Ana' e conta_ana.saldo vale 500. Cada conta criada assim carrega os seus próprios dados, presos a ela.
O que é o self
O self é a peça que confunde no começo e clareia com um exemplo. Ele é sempre o primeiro parâmetro dos métodos e representa o próprio objeto em que o método está agindo. Quando você escreve conta_ana.titular, por baixo dos panos o Python entrega conta_ana como self para o método. Por isso self.titular dentro da classe significa o titular deste objeto específico, seja a conta da Ana ou a do Bruno. O self é como o objeto diz eu mesmo.
class Conta:
def __init__(self, titular, saldo):
self.titular = titular
self.saldo = saldo
conta_ana = Conta("Ana", 500)
conta_bruno = Conta("Bruno", 30)
# self garante que cada objeto guarda os seus proprios dados
print(conta_ana.saldo) # 500
print(conta_bruno.saldo) # 30Dois objetos, dois selfs diferentes: cada saldo pertence à sua própria conta.
Atributos de instância
Os dados que você guarda com self.algo = valor dentro do __init__ chamam-se atributos de instância. Instância porque pertencem a um objeto específico, não à classe inteira. A conta da Ana tem os seus atributos titular e saldo; a do Bruno tem os dela. Mudar um não toca no outro. É por isso que a orientação a objetos resolve o problema dos dados soltos: cada conjunto de dados relacionados fica preso ao seu próprio objeto, com nome claro e acesso pelo ponto.
class Conta:
def __init__(self, titular, saldo=0):
self.titular = titular
self.saldo = saldo
# saldo tem valor padrao 0: da para criar sem informar
nova = Conta("Carla")
print(nova.titular, nova.saldo) # Carla 0
# alterar o atributo de um objeto nao afeta os outros
nova.saldo = 250
print(nova.saldo) # 250Atributos aceitam valor padrão, como saldo=0, e são independentes por objeto.
Note que o parâmetro saldo recebeu um valor padrão, saldo=0. Assim, Conta('Carla') cria uma conta com saldo zero sem você informar nada, exatamente como parâmetros padrão em funções comuns. Depois, nova.saldo = 250 muda o atributo daquela conta e de mais nenhuma. Alterar atributos direto pelo ponto funciona, mas na próxima aula você aprende um caminho melhor: métodos como depositar e sacar, que mudam o saldo com regras, em vez de deixar qualquer parte do código mexer no valor sem controle.
Teste rápido
Quando o método __init__ é executado?
Perguntas frequentes
- Por que o nome é __init__ com esses sublinhados?
- Os dois sublinhados antes e depois marcam um método especial que o Python reconhece e chama sozinho em certos momentos. No caso do __init__, o momento é a criação do objeto. Esses métodos com sublinhados duplos são chamados de métodos mágicos ou dunder, e o __str__ que você verá adiante é outro deles.
- Preciso sempre escrever self como primeiro parâmetro?
- Sim, em todo método de instância. O self representa o objeto atual e o Python o entrega automaticamente na chamada. O nome self é uma convenção fortíssima; tecnicamente poderia ser outro, mas todo mundo usa self, e trocar isso só confunde quem lê.
- Eu chamo o __init__ na mão em algum momento?
- Não. Você nunca escreve conta.__init__() diretamente. Ele é disparado sozinho quando você faz Conta('Ana', 500). Os valores entre os parênteses da criação vão para os parâmetros do __init__, depois do self.
- Qual a diferença entre parâmetro do __init__ e atributo?
- O parâmetro (como titular) é o valor que chega ao método na criação. O atributo (como self.titular) é onde esse valor fica guardado dentro do objeto, para durar depois que o __init__ termina. A linha self.titular = titular copia o parâmetro para o atributo.
- Posso dar valores padrão aos parâmetros do __init__?
- Pode, igual a funções comuns. Escrevendo saldo=0, você permite criar a conta sem informar o saldo, e ela nasce com zero. Parâmetros com padrão vêm depois dos sem padrão. Isso deixa a classe mais flexível de usar.
- Dois objetos podem ter o mesmo valor em um atributo?
- Podem, sem problema. Duas contas com saldo 500 têm o mesmo número, mas são objetos independentes: mudar o saldo de uma não mexe na outra. O que importa é que cada objeto tem a sua própria cópia do atributo, guardada no seu próprio self.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.