objeto - poo python 3
¿Cómo cambio la representación de cadena de una clase de Python? (2)
En Java, puedo anular el método toString()
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 a toString()
Java?
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 así como:
>>> print(c)
A♣
¿Cómo personalizo la representación de cadena de mis instancias de clase?
Estoy usando Python 3.x
El equivalente más cercano a toString
de Java es implementar __str__
para su clase. Pon esto en tu definición de 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:
Esto no es tan fácil como parece, algunas funciones básicas de la biblioteca no funcionan cuando solo se sobreescribe str (comprobado con Python 2.7), vea este hilo de ejemplos Cómo hacer una clase JSON serializable También, 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 se esperaría
EDITAR : respondiendo el 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 de Python de alto nivel. El módulo json
usa 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
json.dumps({''b'': b})
produce
{"b": "b"}
entonces verá que la representación interna es utilizada por algunas bibliotecas nativas, probablemente por razones de rendimiento.
Ver también esto para más detalles: http://www.laurentluce.com/posts/python-string-objects-implementation/