Pular para o conteúdo

Como usar __repr__ no Python?

[

Quando usar .__repr__() vs .__str__() em Python?

por Stephen Gruppetta Mar 22, 2023 0 Comentários

Em Resumo: Use .__repr__() para Programadores vs .__str__() para Usuários

Classes do Python possuem diversos métodos especiais que fornecem comportamentos específicos. Dois desses métodos especiais descrevem o objeto usando uma representação de string, e são eles: .__repr__() e .__str__(). O método .__repr__() retorna uma descrição detalhada para um programador que precisa manter e depurar o código. Já o método .__str__() retorna uma descrição mais simples, com informações voltadas 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 por exemplo utilizando a função print(), strings formatadas e ambientes interativos.

Neste tutorial, você aprenderá como diferenciar .__repr__() vs .__str__() e como utilizar 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__ em Python?

Em Resumo: Use .__repr__() para Programadores vs .__str__() para Usuários

Os métodos especiais .__repr__() e .__str__() retornam representações em string do objeto. Uma representação em string é uma string que mostra informações sobre o objeto. É possível personalizar essas informações para diferentes públicos, como por exemplo os usuários do programa ou outros programadores.

Assim como com outros métodos especiais que possuem duplo underscore no início e no fim de seus nomes, é possível 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 em string informal de um objeto, voltada para o usuário.

O público-alvo para a representação em 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 utilizá-la para recriar um objeto igual ao original.

O método .__str__() fornece uma representação em string voltada para o usuário do programa, que pode não ser necessariamente um programador Python. Portanto, essa representação permite que qualquer usuário entenda e manipule o objeto.

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

Você pode acessar a representação em string de um objeto de várias maneiras. Vamos dar uma olhada em algumas das formas mais comuns:

1. Utilizando a função print()

A forma mais comum de exibir um objeto é utilizando a função print(). Quando você passa um objeto para print(), ele chama o método .__str__() do objeto e imprime a representação em string correspondente:

class Person:
def __init__(self, name):
self.name = name
def __str__(self):
return f"Person: {self.name}"
person = Person("John")
print(person)

Neste exemplo, a chamada print(person) irá imprimir a saída "Person: John", já que o método .__str__() retorna essa representação em string.

2. Utilizando a função str()

Você também pode usar a função str() para obter a representação em string de um objeto. A função str() chama o método .__str__() do objeto e retorna a representação em string correspondente:

class Person:
def __init__(self, name):
self.name = name
def __str__(self):
return f"Person: {self.name}"
person = Person("John")
string_representation = str(person)

Neste exemplo, a variável string_representation será igual a "Person: John", já que o método .__str__() retorna essa representação em string.

3. Utilizando o operador de formatação de string f-string

Outra forma de acessar a representação em string de um objeto é utilizando o operador de formatação de string f-string. Você pode inserir um objeto dentro de uma f-string e a representação em string correspondente será inserida na posição do objeto dentro da string. Para que isso funcione corretamente, o objeto deve ter o método .__str__() definido:

class Person:
def __init__(self, name):
self.name = name
def __str__(self):
return f"Person: {self.name}"
person = Person("John")
message = f"The person is: {person}"

Neste exemplo, a variável message será igual a "The person is: Person: John", já que o método .__str__() retorna a representação em string correspondente.

É importante notar que, se você não definir o método .__str__() em uma classe, o Python irá chamar o método .__repr__() quando ele precisar da representação em string do objeto. Portanto, se você definir apenas .__repr__(), essa representação será usada tanto por str() quanto por print().

Você deve definir .__repr__() e .__str__() em uma classe personalizada?

A resposta para essa pergunta depende do seu caso de uso específico. Em geral, é uma boa prática definir ambos os métodos para uma classe personalizada. Isso permite que você tenha controle sobre a representação em string do objeto, tanto para fins de depuração quanto para a experiência do usuário.

Aqui estão alguns pontos que você deve considerar ao decidir se deve definir .__repr__() e .__str__() em uma classe personalizada:

  1. Depuração e manutenção: .__repr__() é especialmente útil para desenvolvedores que estão depurando e mantendo o código, pois fornece uma descrição detalhada do objeto. Essa descrição pode incluir informações úteis, como o tipo de objeto, o estado interno e os valores dos atributos. Isso pode ajudar a identificar rapidamente problemas e bugs.

  2. Usabilidade do código: .__str__() é útil para usuários do seu programa que precisam entender a saída ou interagir com o objeto. Essa representação em string deve ser clara e fácil de entender para que o usuário possa tomar decisões com base nas informações fornecidas.

  3. Consistência e legibilidade: Definir ambos os métodos .__repr__() e .__str__() em uma classe personalizada ajuda a tornar o código mais consistente e legível. Ao ter uma representação oficial que pode ser usada para recriar objetos e uma representação informal fácil de entender, você melhora tanto a experiência do programador quanto a do usuário.

Em resumo, definir .__repr__() e .__str__() em uma classe personalizada permite que você controle como o objeto é exibido em diferentes contextos. Isso melhora a legibilidade do código, facilita a depuração e oferece uma experiência melhor para usuários do programa.

Conclusão

Neste tutorial, você aprendeu sobre as diferenças entre .__repr__() e .__str__() em Python. Esses métodos especiais permitem que você controle como um programa exibe um objeto em diferentes formas de saída. Você também viu como acessar as representações em string de um objeto utilizando a função print(), a função str() e o operador de formatação de string f-string. A decisão de definir .__repr__() e .__str__() em uma classe personalizada depende do seu caso de uso específico, mas em geral é uma boa prática definir ambos os métodos para melhorar a legibilidade do código e a experiência do usuário.

Espero que você tenha achado este tutorial útil e que agora você tenha uma compreensão clara de quando usar .__repr__() vs .__str__() em Python. Se quiser se aprofundar mais no assunto, não deixe de conferir a documentação oficial do Python sobre repr e str.

Referências: