Para los desarrolladores de Java que están aprendiendo Python, la mejor manera de ver esto es toString () en Java.
Ravi
Respuestas:
189
__repr__debería devolver una representación imprimible del objeto, probablemente una de las formas posibles de crear este objeto. Ver documentación oficial aquí . __repr__es más para desarrolladores mientras__str__ para usuarios finales.
Un simple ejemplo:
>>>classPoint:...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)
lazy1: principalmente quería arreglar el formato (es útil que los ejemplos coincidan lo más posible con lo que verán en una sesión de muestra), pero también modifiqué el formato de salida para que sea explícitamente diferente de la asignación, ya que Mejora enormemente la claridad para alguien confundido sobre esto, en mi humilde opinión. (Si he ido demasiado lejos, solo vuelva a editar, y le debo una cerveza.)
Esto no es realmente correcto. __str__es la salida que se supone que es legible por humanos: __repr__se supone que es una representación legible para el intérprete de Python (es decir, alimentar la cadena al intérprete debería recrear el objeto). Si un objeto no tiene un __str__método, sin embargo, __repr__se usa en su lugar. También como se señaló: este ejemplo en realidad imprime el __str__método de self.xy self.y: %rdebe usarse en lugar de %sen la operación de formateo de cadenas (dado que la clase no define __str__, en __repr__realidad se devuelve de todos modos, pero es una anomalía).
repr ( objeto ): devuelve una cadena que contiene una representación imprimible de un objeto. Este es el mismo valor producido por las conversiones (comillas inversas). A veces es útil poder acceder a esta operación como una función ordinaria. Para muchos tipos, esta función intenta devolver una cadena que arrojaría un objeto con el mismo valor cuando se pasa 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 a menudo incluye el nombre y la dirección del objeto. Una clase puede controlar lo que devuelve esta función para sus instancias definiendo un __repr__()método.
Entonces, lo que está viendo aquí es la implementación predeterminada de __repr__, que es útil para la serialización y la depuración.
Creo que el método de comillas inversas (o 'backticks') para obtener la "representación" de un objeto está en desuso y se eliminó para la versión 3.0
MatrixFrog
MatrixFrog: ambos son ciertos, pero la documentación actual de 2.x todavía dice esto, de donde proviene la cita.
Para muchos objetos, __repr__ y __str__ son la misma función. De hecho, si solo define __str__, entonces __repr__ por defecto solo llama a __str__. El caso más obvio donde esto no es cierto son las cadenas en sí mismas: str ('stackoverflow') regresa stackoverflowpero repr ('stackoverflow') sí 'stackoverflow'.
MatrixFrog
66
Tienes eso al revés, __repr__ nunca usa __str__, pero puede ocurrir lo contrario. Ver docs.python.org/reference/…
13
__repr__es utilizado por el intérprete independiente de Python 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 __repr__>
En los casos en que un __str__método no esté definido en la clase, llamará a la __repr__función en un intento de crear una representación imprimible.
Los retornos de repr()y str()son idénticos para int x, pero hay una diferencia entre los valores de retorno para stry: uno es formal y el otro es informal . Una de las diferencias más importantes entre las representaciones formales e informales es que la implementación predeterminada de __repr__un valor de cadena se puede llamar como un argumento para evaluar, y el valor de retorno sería un objeto de cadena válido, como este:
Cuando creamos nuevos tipos definiendo clases, podemos aprovechar ciertas características de Python para hacer que las nuevas clases sean convenientes de usar. Una de estas características son los "métodos especiales", también conocidos como "métodos mágicos".
Los métodos especiales tienen nombres que comienzan y terminan con dos guiones bajos. Los definimos, pero generalmente no los llamamos directamente por su nombre. En cambio, se ejecutan automáticamente en circunstancias específicas.
Es conveniente poder generar el valor de una instancia de un objeto mediante el uso de una declaración de impresión. Cuando hacemos esto, nos gustaría que el valor se represente en la salida en un formato inequívoco y comprensible. El método especial repr se puede utilizar para organizar que esto suceda. Si definimos este método, se puede llamar automáticamente cuando imprimimos el valor de una instancia de una clase para la que definimos este método. Sin embargo, debe mencionarse que también hay un str método especial, utilizado para un propósito similar, pero no idéntico, que puede tener prioridad, si también lo hemos definido.
Si no lo hemos definido, la repr método para la clase Point3D, y hemos instanciado my_point como una instancia de Point3D, y luego hacemos esto ...
print my_point ... podemos ver esto como la salida ...
No muy bien, ¿eh?
Entonces, definimos el método especial repr o str , o ambos, para obtener un mejor resultado.
**classPoint3D(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 automaticallyprint my_point # __str__ gets called automatically**
Implemente repr para cada clase que implemente. No debería haber excusa. Implemente str para clases que cree que la legibilidad es más importante que la no ambigüedad.
>>> variable
imprime lo que__repr__()
devuelve?Respuestas:
__repr__
debería devolver una representación imprimible del objeto, probablemente una de las formas posibles de crear este objeto. Ver documentación oficial aquí .__repr__
es más para desarrolladores mientras__str__
para usuarios finales.Un simple ejemplo:
fuente
__str__
es la salida que se supone que es legible por humanos:__repr__
se supone que es una representación legible para el intérprete de Python (es decir, alimentar la cadena al intérprete debería recrear el objeto). Si un objeto no tiene un__str__
método, sin embargo,__repr__
se usa en su lugar. También como se señaló: este ejemplo en realidad imprime el__str__
método deself.x
yself.y
:%r
debe usarse en lugar de%s
en la operación de formateo de cadenas (dado que la clase no define__str__
, en__repr__
realidad se devuelve de todos modos, pero es una anomalía).Esto se explica bastante bien en la documentación de Python :
Entonces, lo que está viendo aquí es la implementación predeterminada de
__repr__
, que es útil para la serialización y la depuración.fuente
stackoverflow
pero repr ('stackoverflow') sí'stackoverflow'
.__repr__
es utilizado por el intérprete independiente de Python para mostrar una clase en formato imprimible. Ejemplo:En los casos en que un
__str__
método no esté definido en la clase, llamará a la__repr__
función en un intento de crear una representación imprimible.Además,
print()
la clase llamará__str__
por defecto.Documentación , por favor.
fuente
El método __repr__ simplemente le dice a Python cómo imprimir objetos de una clase
fuente
Un ejemplo para ver las diferencias entre ellos (copié de esta fuente ),
Los retornos de
repr()
ystr()
son idénticos paraint x
, pero hay una diferencia entre los valores de retorno parastr
y
: uno es formal y el otro es informal . Una de las diferencias más importantes entre las representaciones formales e informales es que la implementación predeterminada de__repr__
un valor de cadena se puede llamar como un argumento para evaluar, y el valor de retorno sería un objeto de cadena válido, como este:Si intenta llamar al valor de retorno de
__str__
como argumento para evaluar, el resultado no será válido.fuente
Cuando creamos nuevos tipos definiendo clases, podemos aprovechar ciertas características de Python para hacer que las nuevas clases sean convenientes de usar. Una de estas características son los "métodos especiales", también conocidos como "métodos mágicos".
Los métodos especiales tienen nombres que comienzan y terminan con dos guiones bajos. Los definimos, pero generalmente no los llamamos directamente por su nombre. En cambio, se ejecutan automáticamente en circunstancias específicas.
Es conveniente poder generar el valor de una instancia de un objeto mediante el uso de una declaración de impresión. Cuando hacemos esto, nos gustaría que el valor se represente en la salida en un formato inequívoco y comprensible. El método especial repr se puede utilizar para organizar que esto suceda. Si definimos este método, se puede llamar automáticamente cuando imprimimos el valor de una instancia de una clase para la que definimos este método. Sin embargo, debe mencionarse que también hay un str método especial, utilizado para un propósito similar, pero no idéntico, que puede tener prioridad, si también lo hemos definido.
Si no lo hemos definido, la repr método para la clase Point3D, y hemos instanciado my_point como una instancia de Point3D, y luego hacemos esto ...
print my_point ... podemos ver esto como la salida ...
No muy bien, ¿eh?
Entonces, definimos el método especial repr o str , o ambos, para obtener un mejor resultado.
Salida ...
(1, 2, 3) (1, 2, 3)
fuente
Implemente repr para cada clase que implemente. No debería haber excusa. Implemente str para clases que cree que la legibilidad es más importante que la no ambigüedad.
Consulte este enlace: https://www.pythoncentral.io/what-is-the-difference-between- str -and- repr -in-python /
fuente