Pular para o conteúdo

Como usar eficientemente o método __repr__?

[

Quando usar .repr() vs .str() em Python?

por Stephen Gruppetta Mar 22, 2023 0 Comentários


Uma das tarefas mais comuns que um programa de computador realiza é exibir dados. O programa geralmente exibe essas informações para o usuário do programa. No entanto, um programa também precisa mostrar informações para o 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 .__repr__() vs .__str__() entra em jogo.

Um objeto Python possui 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 a obtida pela 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__() vs .__str__ em 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 personalizar essas informações para diferentes públicos, como usuários de programas ou seus colegas programadores.

Assim como outros métodos especiais com sublinhado duplo no início e no final de 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 oficial em string de um objeto, voltada para o programador.
  • .__str__() fornece a representação informal em string de um objeto, voltada para o usuário.

O público-alvo da representação de string retornada por .__repr__() é o programador que desenvolve e mantém o programa. Em geral, ela fornece informações detalhadas e inequívocas sobre o objeto. Outra propriedade importante da representação oficial em string é 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 necessariamente ser um programador Python. Portanto, essa representação permite que qualquer usuário entenda as informações básicas do objeto.

Como você pode acessar as representações de string de um objeto?

Para acessar as representações de string de um objeto, você pode chamar os métodos .__repr__() e .__str__() diretamente no objeto. Aqui está um exemplo:

class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"Person(name='{self.name}', age={self.age})"
def __str__(self):
return f"Person: {self.name}, {self.age} years old"
person = Person("John", 30)
print(repr(person))
print(str(person))

Saída:

Person(name='John', age=30)
Person: John, 30 years old

No exemplo acima, a classe Person define os métodos .__repr__() e .__str__() que retornam as representações em string do objeto. Chamando repr(person) retorna a representação oficial em string do objeto, enquanto chamando str(person) retorna a representação informal em string do objeto.

Observe que, se você não definir esses métodos para uma classe personalizada, o Python usará as representações de string padrão para os objetos da classe. A representação de string padrão para objetos é geralmente algo como <__main__.ClassName object at 0x7f5db8926550>, que não fornece muita informação útil. Portanto, é uma boa prática definir esses métodos em suas classes personalizadas para fornecer representações mais úteis e informativas.

Devo definir .repr() e .str() em uma classe personalizada?

Definir os métodos .__repr__() e .__str__() em uma classe personalizada é uma prática recomendada. Isso melhora a legibilidade do código e facilita a depuração e manutenção.

A representação oficial em string fornecida pelo método .__repr__() é especialmente útil durante o desenvolvimento e manutenção do programa. Ela permite que você obtenha informações detalhadas sobre um objeto para ajudar na identificação e solução de problemas.

A representação informal em string fornecida pelo método .__str__() é útil para a exibição de informações básicas do objeto para o usuário final do programa. Essa representação deve ser projetada de forma que seja fácil de entender e acessível para usuários não programadores.

Na maioria dos casos, você deve definir tanto .__repr__() quanto .__str__() em suas classes personalizadas. No entanto, se você achar que a representação oficial em string é muito semelhante à representação informal em string, você pode optar por não definir explicitamente o método .__str__() e fazer com que ele retorne a mesma string que .__repr__().

Conclusão

Em resumo, .__repr__() e .__str__() são dois métodos especiais de uma classe Python que fornecem representações em string do objeto. .__repr__() retorna uma representação oficial em string destinada a programadores, enquanto .__str__() retorna uma representação informal em string destinada a usuários do programa.

Definir esses métodos em suas classes personalizadas permite que você controle como os objetos são exibidos em diferentes contextos, tornando seu código mais legível e mais fácil de depurar e manter.

Ao usar Python, lembre-se de considerar quem é o público-alvo da representação de um objeto e escolher entre .__repr__() vs .__str__() de acordo com isso.