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

Resuelto snakile asked hace 13 años • 2 respuestas

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

snakile avatar Feb 06 '11 17:02 snakile
Aceptado

El equivalente más cercano al de Java toStringes 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
Mark Byers avatar Feb 06 '2011 10:02 Mark Byers

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 jsonmódulo se utiliza repara 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/

seeg avatar Nov 21 '2012 09:11 seeg