2009-12-31 7 views
88
def __repr__(self): 
    return '<%s %s (%s:%s) %s>' % (
    self.__class__.__name__, self.urlconf_name, self.app_name, 
    self.namespace, self.regex.pattern) 

¿Cuál es la importancia/propósito de este método?Propósito de Python's __repr__

+0

@ zjm1126: ¿quieres saber por qué lo hace '>>> print variable' qué' __repr __() 'regresa? – voyager

+11

Esa documentación pone a las personas a dormir. Además, es útil aprender de los demás cómo se usa esto. – Dombey

+0

Posible duplicado de [Diferencia entre \ _ \ _ str \ _ \ _ y \ _ \ _ repr \ _ \ _ en Python] (http://stackoverflow.com/questions/1436703/difference-between-str-and-repr- in-python) –

Respuesta

116

__repr__ debe devolver una representación imprimible del objeto, muy probablemente uno de las maneras posibles de crear este objeto. Ver la documentación oficial here. __repr__ es más para los desarrolladores, mientras que __str__ es para usuarios finales.

Un ejemplo sencillo:

>>> 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: Principalmente quería arreglar el formateo (es útil tener ejemplos que coincidan lo más cerca posible con lo que verán en una sesión de muestra), pero también modifiqué el formato de salida para que fuera explícitamente diferente de la tarea, ya que mejora enormemente la claridad para alguien confundido sobre esto, yo. (Si he ido demasiado lejos, solo vuelva a editar, y le debo una cerveza.) –

+2

Omitió la referencia: http://docs.python.org/reference/datamodel.html#object.__repr__ –

+1

This debería usar% r en vez de% s: http://stackoverflow.com/questions/6005159/when-to-use-r-instead-of-s-in-python –

11

Esto se explica bastante bien en el Python documentation:

repr (objeto): Devuelve una cadena que contiene una representación imprimible de un objeto. Este es el mismo valor generado por las conversiones (comillas inversas). A veces es útil poder acceder a esta operación como una función normal. Para muchos tipos, esta función intenta devolver una cadena que produciría un objeto con el mismo valor cuando se pasa a eval(); de lo contrario, la representación es una cadena entre corchetes angulares que contiene el nombre del tipo de objeto junto con información adicional que a menudo incluye el nombre y la dirección del objeto. Una clase puede controlar qué devuelve esta función para sus instancias definiendo un método __repr __().

Lo que está viendo aquí es la implementación predeterminada de __repr__, que es útil para la serialización y la depuración.

+5

Creo que el método de cotizaciones inversas (o 'backticks') para obtener la "representación" de un objeto está obsoleto, y se eliminó para la versión 3.0 – MatrixFrog

+0

MatrixFrog: ambos verdaderos, pero la documentación 2.x actual todavía dice esto, que es de donde es la cita. –

+0

Para muchos objetos, _ \ _ repr _ \ _ y _ \ _ str _ \ _ son la misma función. De hecho, si solo define _ \ _ str _ \ _, entonces _ \ _ repr _ \ _ por defecto simplemente llama a _ \ _ str _ \ _.El caso más obvio en el que esto no es cierto son las cadenas mismas: str ('stackoverflow') devuelve 'stackoverflow' pero repr ('stackoverflow') es' 'stackoverflow''. – MatrixFrog

4

El método __repr__ simplemente le dice a Python cómo imprimir objetos de una clase

5

__repr__ es utilizado por el intérprete de Python independiente para mostrar una clase en formato imprimible. Ejemplo:

~> 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> 

En los casos en que un método __str__ no está definido en la clase, se llamará a la función __repr__ en un intento de crear una representación imprimible.

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

Además, print() ing la clase va a llamar __str__ por defecto.


Documentation, si por favor