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

__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)    # 500

O __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)  # 30

Dois 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)                # 250

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