¿Cómo cambio la representación de cadena de una clase Python? [duplicar]
Esta pregunta ya tiene una respuesta aquí:
- ¿Cómo imprimir objetos de clase usando print()? 10 respuestas
En Java, puedo anular el método toString()
de mi clase. A continuación, la función print de Java imprime la representación de cadena del objeto definido por su toString()
. ¿Existe un Python equivalente al toString()
de Java?
Por ejemplo, tengo un Clase de PlayCard. Tengo una instancia c de PlayCard. Ahora:
>>> print(c)
<__main__.Card object at 0x01FD5D30>
Pero lo que quiero es algo como:
>>> print(c)
A♣
¿Cómo puedo personalizar la representación de cadenas de las instancias de mi clase?
Estoy usando Python 3.x
2 answers
El equivalente más cercano a toString
de Java es implementar __str__
para su clase. Pon esto en la definición de tu clase:
def __str__(self):
return "foo"
Es posible que también desee implementar __repr__
para ayudar en la depuración.
Vea aquí para más información:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-06 11:19:27
Esto no es tan fácil como parece, algunas funciones de la biblioteca central no funcionan cuando solo se sobrescribe str (comprobado con Python 2.7), vea este hilo para ver ejemplos Cómo hacer serializable una clase JSON También, prueba esto
import json
class A(unicode):
def __str__(self):
return 'a'
def __unicode__(self):
return u'a'
def __repr__(self):
return 'a'
a = A()
json.dumps(a)
Produce
'""'
Y no
'"a"'
Como era de esperar.
EDIT : respondiendo al comentario de mchicago:
Unicode no tiene ningún atributo is es una cadena inmutable, cuyo valor es oculto y no disponible en código Python de alto nivel. El módulo json
utiliza re
para generar la representación de cadena que parece tener acceso a este atributo interno. Aquí hay un ejemplo simple para justificar esto:
b = A('b')
print b
Produce
'a'
Mientras que
json.dumps({'b': b})
Produce
{"b": "b"}
Así que verá que la representación interna es utilizada por algunas bibliotecas nativas, probablemente por razones de rendimiento.
Véase también esto para más detalles: http://www.laurentluce.com/posts/python-string-objects-implementation/
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:56