Objetivo do __repr__ do Python


139
def __repr__(self):
  return '<%s %s (%s:%s) %s>' % (
    self.__class__.__name__, self.urlconf_name, self.app_name,
    self.namespace, self.regex.pattern)

Qual é o significado / objetivo deste método?


@ zjm1126: você quer saber por que >>> variableimprime o que __repr__()retorna?
Esteban Küber

19
Essa documentação leva as pessoas a dormir. Além disso, é útil aprender com os outros como isso é usado.
amigos estão


2
Para desenvolvedores Java que estão aprendendo Python, a melhor maneira de ver isso é como toString () em Java.
Ravi

Respostas:


188

__repr__deve retornar uma representação imprimível do objeto, provavelmente uma das maneiras possíveis para criar esse objeto. Veja a documentação oficial aqui . __repr__é mais para desenvolvedores e __str__para usuários finais.

Um exemplo simples:

>>> class Point:
...   def __init__(self, x, y):
...     self.x, self.y = x, y
...   def __repr__(self):
...     return 'Point(x=%s, y=%s)' % (self.x, self.y)
>>> p = Point(1, 2)
>>> p
Point(x=1, y=2)

2
lazy1: Eu queria principalmente corrigir a formatação (é útil ter exemplos o mais próximo possível do que eles verão em uma sessão de amostra), mas também aprimorei o formato de saída para ser explicitamente diferente da atribuição, pois isso melhora muito a clareza para alguém confuso sobre isso, imho. (Se eu fomos longe demais, apenas re-edição, e eu vou te devo uma cerveja.)


1
Isso deve talvez usar% r em vez de% s: stackoverflow.com/questions/6005159/...
Jonathan Adelson

43
Isso não está realmente correto. __str__é a saída que deve ser legível por humanos: __repr__deve ser uma representação legível para o intérprete Python (ou seja, alimentar a string com o intérprete deve recriar o objeto). Se um objeto não tiver um __str__método, no entanto, __repr__será usado. Também conforme observado: este exemplo realmente imprime o __str__método de self.xe self.y: %rdeve ser usado em vez de %sna operação de formatação de string (como a classe não define __str__, __repr__na verdade é retornada de qualquer maneira, mas é uma anomalia).
Daniel Andersson

20

Isso é explicado muito bem na documentação do Python :

repr ( objeto ): retorna uma string contendo uma representação imprimível de um objeto. Esse é o mesmo valor gerado pelas conversões (aspas reversas). Às vezes, é útil poder acessar esta operação como uma função comum. Para muitos tipos, essa função tenta retornar uma sequência que produziria um objeto com o mesmo valor quando passado para eval()outra função ; caso contrário, a representação é uma sequência entre colchetes angulares que contém o nome do tipo do objeto juntamente com informações adicionais geralmente incluindo o nome e o endereço do objeto. Uma classe pode controlar o que essa função retorna para suas instâncias, definindo um __repr__()método.

Então, o que você está vendo aqui é a implementação padrão __repr__, útil para serialização e depuração.


5
Eu acho que o método de aspas reversas (ou 'backticks') de obter a "representação" de um objeto está obsoleto e foi removido para a versão 3.0
MatrixFrog

MatrixFrog: ambos verdadeiros, mas a documentação 2.x atual ainda diz isso, e é daí que a citação é.

Para muitos objetos, __repr__ e __str__ são a mesma função. De fato, se você definir apenas __str__, então __repr__ usará como padrão apenas __str__. O caso mais óbvio em que isso não é verdade são as próprias strings: str ('stackoverflow') retorna stackoverflowmas repr ('stackoverflow') é 'stackoverflow'.
MatrixFrog

6
Você tem isso ao contrário, __repr__ nunca usa __str__, mas o inverso pode acontecer. Veja docs.python.org/reference/…

13

__repr__é usado pelo interpretador Python independente para exibir uma classe em formato imprimível. Exemplo:

~> python3.5
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  5 2015, 21:12:44) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> class StackOverflowDemo:
...     def __init__(self):
...         pass
...     def __repr__(self):
...         return '<StackOverflow demo object __repr__>'
... 
>>> demo = StackOverflowDemo()
>>> demo
<StackOverflow demo object __repr__>

Nos casos em que um __str__método não está definido na classe, ele chamará a __repr__função na tentativa de criar uma representação imprimível.

>>> str(demo)
'<StackOverflow demo object __repr__>'

Além disso, print()a classe chamará __str__por padrão.


Documentação , por favor


7

O método __repr__ simplesmente informa ao Python como imprimir objetos de uma classe


1

Um exemplo para ver as diferenças entre eles (copiei desta fonte ),

>>> x=4
>>> repr(x)
'4'
>>> str(x)
'4'
>>> y='stringy'
>>> repr(y)
"'stringy'"
>>> str(y)
'stringy'

Os retornos de repr()e str()são idênticos para int x, mas há uma diferença entre os valores de retorno para str y- um é formal e o outro é informal . Uma das diferenças mais importantes entre as representações formais e informais é que a implementação padrão de __repr__um valor de str pode ser chamada como um argumento para avaliar, e o valor de retorno seria um objeto de string válido, como este:

>>> repr(y)
"'a string'"
>>> y2=eval(repr(y))
>>> y==y2
True

Se você tentar chamar o valor de retorno __str__como um argumento para avaliar, o resultado não será válido.


1

Quando criamos novos tipos definindo classes, podemos tirar proveito de certos recursos do Python para tornar as novas classes convenientes de usar. Um desses recursos é "métodos especiais", também chamados de "métodos mágicos".

Métodos especiais têm nomes que começam e terminam com dois sublinhados. Nós os definimos, mas geralmente não os chamamos diretamente pelo nome. Em vez disso, eles são executados automaticamente sob circunstâncias específicas.

É conveniente poder gerar o valor de uma instância de um objeto usando uma instrução print. Quando fazemos isso, gostaríamos que o valor fosse representado na saída em algum formato inequívoco compreensível. O método especial repr pode ser usado para organizar isso. Se definirmos esse método, ele poderá ser chamado automaticamente quando imprimirmos o valor de uma instância de uma classe para a qual definimos esse método. Deve-se mencionar, no entanto, que também existe um método especial str , usado para uma finalidade semelhante, mas não idêntica, que pode ter precedência, se também o tivermos definido.

Se não definimos, o método repr para a classe Point3D e instanciamos my_point como uma instância do Point3D, e fazemos isso ...

print my_point ... podemos ver isso como a saída ...

Não é muito legal, né?

Portanto, definimos o método especial repr ou str , ou ambos, para obter uma saída melhor.

**class Point3D(object):
    def __init__(self,a,b,c):
        self.x = a
        self.y = b
        self.z = c
    def __repr__(self):
        return "Point3D(%d, %d, %d)" % (self.x, self.y, self.z)
    def __str__(self):
        return "(%d, %d, %d)" % (self.x, self.y, self.z)
my_point = Point3D(1, 2, 3)
print my_point # __repr__ gets called automatically
print my_point # __str__ gets called automatically**

Resultado ...

(1, 2, 3) (1, 2, 3)


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.