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__.
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 __str__.
Os objetivos desta aula. 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__.
Veja o essencial, parte por parte.
O texto feio por padrão. Sem __str__, print(objeto) mostra o nome da classe e um endereço de memória.
Definindo o __str__. O __str__ recebe self, como todo método de instância, e deve retornar uma string.
O primo __repr__. Existe um método parecido, o __repr__, com um propósito diferente.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
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.00O __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.