Módulo 10 - Orientação a objetos: classes

O método __str__

10 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026

O que você vai aprender

  • Entender por que imprimir um objeto sem __str__ mostra um texto feio.
  • Definir __str__ para devolver uma frase clara sobre o objeto.
  • Ver o __str__ sendo usado sozinho por print e por str().
  • Conhecer, em visão geral, a diferença entre __str__ e __repr__.

O texto feio por padrão

Você já viu que imprimir um objeto recém-criado resulta em algo como Conta object at 0x000001. Esse texto informa a classe e um endereço de memória, o que é inútil para uma pessoa. Faz sentido: o Python não tem como adivinhar como você quer mostrar a sua conta. Para dar a ele essa informação, a classe ganha um método especial chamado __str__, que devolve o texto a exibir. A partir daí, print passa a mostrar a sua frase, não o endereço.

class Conta:
    def __init__(self, titular, saldo=0):
        self.titular = titular
        self.saldo = saldo

c = Conta("Ana", 500)
print(c)  # <__main__.Conta object at 0x000001A2...>

Sem __str__, o print mostra a classe e um endereço de memória.

O endereço muda a cada execução e não diz nada sobre o titular ou o saldo. Em um programa real, você quer ver algo como Conta de Ana, saldo R$ 500,00. Esse é o trabalho do __str__: transformar o objeto em uma frase legível. Ele é outro método mágico ou dunder, da mesma família do __init__, com dois sublinhados antes e depois do nome, chamado pelo Python em momentos específicos, neste caso quando o objeto precisa virar texto.

Definindo o __str__

O __str__ recebe self, como todo método de instância, e deve retornar uma string. Dentro dele, você monta a frase usando os atributos do objeto, normalmente com uma f-string. O ponto crucial é o return: o __str__ devolve o texto, não o imprime. Quem imprime é o print, depois de chamar o __str__ para obter a frase. Esquecer o return, ou usar print dentro do __str__, é o erro mais comum aqui.

class Conta:
    def __init__(self, titular, saldo=0):
        self.titular = titular
        self.saldo = saldo

    def __str__(self):
        return f"Conta de {self.titular}, saldo R$ {self.saldo:.2f}"

c = Conta("Ana", 500)
print(c)        # Conta de Ana, saldo R$ 500.00
texto = str(c)
print(texto)    # Conta de Ana, saldo R$ 500.00

O __str__ retorna a frase; print e str() a usam automaticamente.

Agora print(c) mostra Conta de Ana, saldo R$ 500.00, e str(c) devolve a mesma frase como texto, para você guardar em uma variável ou juntar com outros. O formato :.2f dentro da f-string arredonda o saldo para duas casas, útil para dinheiro. Nenhuma dessas chamadas menciona __str__ diretamente: tanto o print quanto o str() sabem procurá-lo sozinhos. Você define uma vez e colhe o benefício em todo lugar que exibe o objeto.

O primo __repr__

Existe um método parecido, o __repr__, com um propósito diferente. Enquanto o __str__ é o texto amigável para o usuário final, o __repr__ é a representação técnica, voltada a quem programa e à depuração. É o que aparece quando você digita o objeto direto no console interativo, sem print, e também quando o objeto está dentro de uma lista impressa. Se a classe define só o __repr__, o Python o usa também no lugar do __str__ como recurso reserva.

class Conta:
    def __init__(self, titular, saldo=0):
        self.titular = titular
        self.saldo = saldo

    def __str__(self):
        return f"Conta de {self.titular}, saldo R$ {self.saldo:.2f}"

    def __repr__(self):
        return f"Conta(titular={self.titular!r}, saldo={self.saldo!r})"

c = Conta("Ana", 500)
print(c)          # Conta de Ana, saldo R$ 500.00   (usa __str__)
print([c])        # [Conta(titular='Ana', saldo=500)]   (usa __repr__)

__str__ para exibir; __repr__ para depurar. Dentro de listas, o Python usa __repr__.

Repare que print(c) usa o __str__ (frase amigável), mas print([c]), com a conta dentro de uma lista, usa o __repr__ (forma técnica). O !r na f-string pede a representação técnica de cada valor. Uma boa prática é fazer o __repr__ mostrar como o objeto poderia ser recriado, como Conta(titular='Ana', saldo=500). Para as suas classes, comece definindo o __str__, que resolve a exibição no dia a dia; o __repr__ vem quando você quiser mensagens de depuração mais claras. Na prática final, a ContaBancaria terá o seu __str__ para se mostrar por inteiro.

Teste rápido

O que o método __str__ deve fazer no seu corpo?

Perguntas frequentes

Por que imprimir um objeto sem __str__ mostra aquele endereço?
Porque o Python não sabe como você quer exibir aquele objeto, então recorre a uma exibição genérica: o nome da classe e um endereço de memória. Definindo o __str__, você ensina o objeto a se descrever, e o print passa a mostrar a sua frase.
Preciso chamar o __str__ na mão?
Não. O print e a função str() o chamam sozinhos quando precisam do texto do objeto. Você só define o método na classe; o Python cuida de invocá-lo no momento certo, igual ao __init__ na criação.
O __str__ pode retornar algo que não seja texto?
Não. Ele deve retornar uma string. Se você tentar devolver um número ou outro tipo, o Python levanta um erro. Se quiser mostrar números, transforme-os em texto dentro da frase, normalmente com uma f-string.
Qual a diferença prática entre __str__ e __repr__?
O __str__ é o texto amigável para o usuário, usado pelo print. O __repr__ é a forma técnica para quem programa, usada no console interativo e quando o objeto aparece dentro de listas. No começo, definir o __str__ já resolve a exibição do dia a dia.
Se eu definir só o __repr__, o print funciona?
Funciona. Quando não há __str__, o Python usa o __repr__ como reserva também para o print. O contrário não vale: ter só o __str__ não preenche o __repr__, que continua na forma genérica dentro de listas e no console.
O que faz o :.2f dentro da f-string do exemplo?
Formata o número com duas casas decimais, ideal para valores em dinheiro: 500 vira 500.00. É o mesmo recurso de formatação das f-strings do Básico, aqui aplicado ao saldo dentro do __str__ para exibir o valor de forma consistente.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.