¿Cómo cambio la representación de cadena de una clase Python? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

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

Author: Elouan Keryell-Even, 2011-02-06

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:

 220
Author: Mark Byers,
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/

 28
Author: seeg,
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