Como utilizar o método __repr__ Python?
Quando usar .repr() vs .str() em Python?
por Stephen Gruppetta Mar 22, 2023 0 Comentários boas práticas intermediário
Uma das tarefas mais comuns que um programa de computador realiza é exibir dados. O programa frequentemente exibe essas informações para o usuário do programa. No entanto, um programa também precisa mostrar informações ao programador que está desenvolvendo e mantendo-o. As informações que um programador precisa sobre um objeto diferem de como o programa deve exibir o mesmo objeto para o usuário, e é aí que entra o .__repr__()
vs .__str__()
.
Um objeto Python tem vários métodos especiais que fornecem comportamentos específicos. Existem dois métodos especiais semelhantes que descrevem o objeto usando uma representação de string. Esses métodos são .__repr__()
e .__str__()
. O método .__repr__()
retorna uma descrição detalhada para um programador que precisa manter e depurar o código. O método .__str__()
retorna uma descrição mais simples com informações para o usuário do programa.
Os métodos .__repr__()
e .__str__()
são dois dos métodos especiais que você pode definir para qualquer classe. Eles permitem que você controle como um programa exibe um objeto em várias formas comuns de saída, como o resultado da função print()
, strings formatadas e ambientes interativos.
Neste tutorial, você aprenderá como diferenciar .__repr__()
vs .__str__()
e como usar esses métodos especiais nas classes que você define. Definir esses métodos torna as classes que você escreve mais legíveis e mais fáceis de depurar e manter. Então, quando você deve escolher entre .__repr__()
e .__str__()
do Python?
Em resumo: Use .__repr__()
para Programadores vs .__str__()
para Usuários
Os métodos especiais .__repr__()
e .__str__()
retornam representações de string do objeto. Uma representação de string é uma string que mostra informações sobre o objeto. Você pode adaptar essas informações para diferentes públicos, como usuários do programa ou colegas programadores.
Como ocorre com outros métodos especiais com duplo sublinhado inicial e final em seus nomes, você pode definir esses métodos para qualquer classe.
A razão pela qual existem dois métodos para exibir um objeto é que eles têm propósitos diferentes:
.__repr__()
fornece a representação de string oficial de um objeto, voltada para o programador..__str__()
fornece a representação de string informal de um objeto, voltada para o usuário.
O público-alvo da representação de string retornada por .__repr__()
é o programador que está desenvolvendo e mantendo o programa. Em geral, ela fornece informações detalhadas e inequívocas sobre o objeto. Outra propriedade importante da representação de string oficial é que um programador normalmente pode usá-la para recriar um objeto igual ao original.
O método .__str__()
fornece uma representação de string direcionada ao usuário do programa, que pode não ser necessariamente um programador Python. Portanto, essa representação permite que qualquer usuário entenda informações básicas sobre o objeto.
Aqui está um exemplo que demonstra a diferença entre .__repr__()
e .__str__()
:
No exemplo acima, a chamada do método print(p)
usa .__str__()
para exibir o objeto p
como uma string (2, 4)
. A chamada print(repr(p))
usa .__repr__()
para exibir o mesmo objeto como uma string Ponto(x=2, y=4)
.
Como você pode acessar as representações de string de um objeto?
Agora que você sabe como diferenciar .__repr__()
de .__str__()
, como você pode acessar essas representações de string quando está trabalhando com um objeto em Python?
Existem várias maneiras de acessar as representações de string de um objeto:
-
Usando a função
print()
: Quando você chamaprint(obj)
, o Python verifica se o objeto tem um método.__str__()
definido. Se tiver, ele usará esse método para exibir o objeto como uma string. Se o método.__str__()
não estiver definido, o Python usará o método.__repr__()
em vez disso. -
Usando a função
str()
: Ao chamarstr(obj)
, o Python procura por um método.__str__()
no objeto e o utiliza para obter a representação de string. Se o método.__str__()
não estiver definido, o Python recorrerá ao método.__repr__()
. -
Usando a função
repr()
: Ao chamarrepr(obj)
, o Python procurará por um método.__repr__()
no objeto e o usará para obter a representação de string. O método.__str__()
não é utilizado. -
Usando formatação de string: Você pode usar as formatações de string do Python, como
f"{}".format(obj)
, para exibir a representação de string de um objeto. O Python irá preferir o método.__str__()
se estiver definido, senão, irá recorrer ao método.__repr__()
.
Aqui está um exemplo que mostra como acessar as representações de string de um objeto em diferentes contextos:
No exemplo acima, o objeto p
é uma instância da classe Pessoa
. Usando diferentes métodos e formatos, podemos obter a representação de string adequada para diferentes finalidades.
Devo definir .repr() e .str() em uma classe personalizada?
A definição dos métodos .__repr__()
e .__str__()
em uma classe personalizada é opcional. No entanto, é uma boa prática fornecer pelo menos uma dessas representações de string para que você possa exibir seus objetos de forma mais adequada em diferentes contextos.
Como mencionado anteriormente, .__repr__()
é o método que o Python usa por padrão quando uma representação de string não é fornecida explicitamente. Portanto, é altamente recomendável definir pelo menos .__repr__()
para todas as classes personalizadas. Isso garante que você tenha uma representação detalhada e inequívoca do objeto para depuração e manutenção do código.
Se você precisar fornecer uma representação de string mais legível e amigável para os usuários do seu programa, você também pode definir o método .__str__()
. Isso permitirá que você exiba seus objetos de uma forma mais simplificada e compreensível para o usuário final.
Conclusão
Em resumo, os métodos .__repr__()
e .__str__()
fornecem maneiras de controlar como um objeto é exibido em forma de string em Python. A principal diferença entre eles é o público-alvo da representação de string. .__repr__()
é voltado para programadores e fornece uma descrição detalhada e inequívoca do objeto. .__str__()
é voltado para usuários do programa e fornece uma descrição mais simplificada e amigável.
Definir esses métodos em suas classes personalizadas permite que você forneça representações adequadas do objeto em diferentes contextos, como a função print()
ou formatação de strings. Isso torna seus objetos mais legíveis, mais fáceis de depurar e mais fáceis de manter.
Em geral, você deve definir .__repr__()
para todas as suas classes personalizadas e, se necessário, definir .__str__()
para fornecer uma representação mais simplificada para os usuários finais de seu programa.
Entendendo a diferença entre .__repr__()
e .__str__()
e sabendo quando usá-los, você será capaz de criar classes mais eficazes e melhorar a qualidade do seu código Python.