Qual a Diferença Entre __str__ e __repr__ em Python

Ana Maria Gomes
5 minutos de leitura

Conteúdos do tutorial

Quando você está trabalhando com Python, frequentemente precisa decidir como seus objetos devem ser representados como strings. É aí que entram em jogo os métodos especiais para representação de objetos. Entender a diferença entre __str__ e __repr__ em Python é crucial para desenvolvedores Python, pois eles servem a propósitos distintos e são usados em contextos diferentes.

O que é o método __repr__ e quando utilizá-lo

O método __repr__ em Python é projetado para fornecer uma representação inequívoca de um objeto. Ele é usado principalmente para fins de depuração e desenvolvimento. O objetivo é criar uma string que, se passada para a função eval(), poderia (teoricamente) recriar o objeto. No entanto, na prática, criar tal representação pode ser complexo e não é comumente feito.

A implementação padrão de __repr__ em Python não é particularmente útil, pois simplesmente retorna a classe e o endereço de memória do objeto. Portanto, é uma boa prática sempre implementar um método __repr__ que forneça informações significativas sobre o estado do objeto.

Por exemplo, se você tem uma classe Ponto, uma boa implementação de __repr__ poderia ser assim:

class Ponto:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __repr__(self):
        return f"Ponto(x={self.x!r}, y={self.y!r})"

Note o uso de !r na string de formatação, que garante que a saída de __repr__ seja ela mesma representada de forma inequívoca.

O que é o método __str__ e quando utilizá-lo

Por outro lado, __str__ tem como objetivo fornecer uma representação legível e amigável para humanos de um objeto. É o que é chamado quando você imprime um objeto ou usa a função embutida str(). Diferente de __repr__, __str__ não precisa ser inequívoco; ele apenas precisa ser claro e conciso para o usuário final.

Se você tem uma classe Data, um método __str__ poderia ser assim:

class Data:
    def __init__(self, dia, mes, ano):
        self.dia = dia
        self.mes = mes
        self.ano = ano

    def __str__(self):
        return f"{self.dia}/{self.mes}/{self.ano}"

Este método __str__ fornece um formato de data simples e familiar que é fácil de ser entendido pelos usuários.

Como os Contêineres Usam __repr__

É interessante notar que, quando você imprime um contêiner como uma lista ou um dicionário, o Python usa o método __repr__ dos objetos contidos para representá-los dentro do contêiner. Isso ocorre porque o __repr__ dos objetos contidos é mais provável de ser útil para entender a estrutura do contêiner.

Resumo

Em resumo, sempre implemente um método __repr__ para suas classes para fornecer uma representação em string clara e inequívoca de seus objetos. Isso é essencial para depuração e registro de logs. Implementar __str__ é opcional e deve ser feito quando você deseja uma representação em string amigável ao usuário de um objeto. Lembre-se, __repr__ é para desenvolvedores, e __str__ é para clientes. Seguindo essas diretrizes, você garantirá que seus objetos Python sejam representados de forma eficaz tanto no desenvolvimento quanto em aplicações voltadas para usuários.

Inscreva-se gratuitamente e fique atualizado

Receba toda semana um resumo dos principais conteúdos da Asimov direto no seu e-mail. 100% livre de spam.

Áreas de interesse:
Conteúdos do tutorial