¿Cómo cambio la representación de cadena de una clase de Python? [duplicar]
En Java, puedo anular el toString()
método de mi clase. Luego, la función de impresión de Java imprime la representación de cadena del objeto definido por su toString()
. ¿Existe un Python equivalente al de Java toString()
?
Por ejemplo, tengo una 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 personalizo la representación de cadenas de mis instancias de clase?
Estoy usando Python 3.x
El equivalente más cercano al de Java toString
es implementarlo __str__
para su clase. Pon esto en tu definición de clase:
def __str__(self):
return "foo"
Es posible que también desee implementarlo __repr__
para ayudar en la depuración.
Consulte aquí para obtener más información:
- Nombres de métodos especiales: personalización básica
Esto no es tan fácil como parece, algunas funciones principales de la biblioteca no funcionan cuando solo se sobrescribe str (verificado con Python 2.7), vea este hilo para ver ejemplos Cómo hacer que una clase JSON sea serializable Además, intente 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.
EDITAR : respondiendo al comentario de mchicago:
Unicode no tiene ningún atributo: es una cadena inmutable, cuyo valor está oculto y no está disponible en el código Python de alto nivel. El json
módulo se utiliza re
para generar la representación de cadena que parece tener acceso a este atributo interno. He aquí un ejemplo sencillo para justificar esto:
b = A('b')
print b
produce
'a'
mientras
json.dumps({'b': b})
produce
{"b": "b"}
entonces verá que algunas bibliotecas nativas utilizan la representación interna, probablemente por razones de rendimiento.
Consulte también esto para obtener más detalles: http://www.laurentluce.com/posts/python-string-objects-implementation/