Estoy aprendiendo las cuerdas en Python. Cuando intento imprimir un objeto de clase Foobar
usando la print()
función, obtengo un resultado como este:
<__main__.Foobar instance at 0x7ff2a18c>
¿Hay alguna manera de establecer el comportamiento de impresión (o la representación de cadena ) de una clase y sus objetos ? Por ejemplo, cuando llamo print()
a un objeto de clase, me gustaría imprimir sus miembros de datos en un formato determinado. ¿Cómo lograr esto en Python?
Si está familiarizado con las clases de C ++, lo anterior se puede lograr para el estándar ostream
agregando un friend ostream& operator << (ostream&, const Foobar&)
método para la clase.
Como mencionó Chris Lutz , esto se define por el
__repr__
método en su clase.De la documentación de
repr()
:Dada la siguiente clase de prueba:
.. actuará de la siguiente manera en el shell de Python:
Si no
__str__
se define método,print(t)
(oprint(str(t))
) utilizará el resultado de__repr__
vezSi no
__repr__
se define ningún método, se utiliza el predeterminado, que es más o menos equivalente a ...fuente
__str__
es diferente de los resultados del shell interactivo que das. : P%
formato de cadena no está en desuso, de docs.python.org/whatsnew/2.6.html "el operador% se complementa con un método de formato de cadena más potente, format ()"%
ha sido muy conveniente.Una forma genérica que se puede aplicar a cualquier clase sin formato específico podría hacerse de la siguiente manera:
Y entonces,
produce
fuente
Si estás en una situación como @Keith, puedes probar:
Va en contra de lo que yo consideraría un buen estilo, pero si solo está tratando de depurar, entonces debería hacer lo que quiera.
fuente
Solo para agregar mis dos centavos a la respuesta de @ dbr, el siguiente es un ejemplo de cómo implementar esta oración de la documentación oficial que ha citado:
Dada esta definición de clase:
Ahora, es fácil serializar la instancia de
Test
clase:Entonces, ejecutando el último fragmento de código, obtendremos:
Pero, como dije en mi último comentario: ¡más información está aquí !
fuente
Necesitas usar
__repr__
. Esta es una función estándar como__init__
. Por ejemplo:fuente
Una versión más bonita de la respuesta de @ user394430
Produce una buena lista visual de los nombres y valores.
Una versión aún más elegante (gracias Ruud) clasifica los elementos:
fuente
Para Python 3:
Si el formato específico no es importante (por ejemplo, para la depuración) simplemente herede de la clase Printable a continuación. No es necesario escribir código para cada objeto.
Inspirado por esta respuesta
fuente
Ya hay muchas respuestas en este hilo, pero ninguna de ellas me ayudó particularmente, tuve que resolverlo yo mismo, así que espero que esta sea un poco más informativa.
Solo tiene que asegurarse de tener paréntesis al final de su clase, por ejemplo:
Aquí hay un ejemplo de código de un proyecto en el que estaba trabajando:
Para imprimir mi clase de hidrógeno, utilicé lo siguiente:
Tenga en cuenta que esto no funcionará sin los paréntesis al final de Hidrógeno. Son necesarios.
Espero que esto ayude, avíseme si tiene más preguntas.
fuente