Qual a Diferença Entre __str__ e __repr__ em Python

Avatar de Ana Maria Ana Maria
3 minutos de leitura 5 meses atrás

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.

Curso Gratuito

Curso gratuito de Python

Do zero ao primeiro projeto em apenas 2 horas

Criar conta gratuita

Comentários

Comentar
Você tem o Acesso Básico.
Libere seu acesso ao suporte dos professores Garanta seu acesso PRO para tirar todas suas dúvidas com nossa equipe.
Seja PRO