204 votes

Comment changer la représentation sous forme de chaîne d'une classe Python?

En Java, je peux remplacer le toString() méthode de ma classe. Puis Java fonction d'impression de l'affiche la chaîne de caractères de la représentation de l'objet défini par ses toString(). Est-il un Python équivalent à Java toString()?

Par exemple, j'ai un PlayCard classe. J'ai une instance de c de PlayCard. Maintenant:

>>> print(c)
<__main__.Card object at 0x01FD5D30>

Mais ce que je veux, c'est quelque chose comme:

>>> print(c)
A♣

Comment puis-je personnaliser la représentation de chaîne de mon instances de classe?

Je suis à l'aide de Python 3.x

261voto

Mark Byers Points 318575

L'équivalent le plus proche de toString de Java consiste à implémenter __str__ pour votre classe. Mettez ceci dans votre définition de classe:

 def __str__(self):
     return "foo"
 

Vous pouvez également vouloir implémenter __repr__ pour faciliter le débogage.

Voir ici pour plus d'informations:

34voto

seeg Points 710

Ce n'est pas aussi facile qu'il semble, un certain noyau de la bibliothèque de fonctions ne fonctionnent pas seulement str est écrasé (vérifié avec Python 2.7), voir ce fil de discussion pour des exemples Python: comment faire une classe JSON serializable Aussi, essayez ceci

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)

produit

'""'

et pas

'"a"'

comme on pourrait l'attendre.

EDIT: répondre à des mchicago commentaire:

unicode n'a pas d'attributs -- il est immuable de la chaîne, la valeur de ce qui est caché et n'est pas disponible à partir de haut-niveau du code Python. L' json module utilise re pour la génération de la représentation de chaîne qui semble avoir accès à cet attribut interne. Voici un exemple simple pour justifier ce:

b = A('b') print b

produit

'a'

alors que

json.dumps({'b': b})

produit

{"b": "b"}

vous voyez donc que la représentation interne est utilisé par certaines bibliothèques natives, probablement pour des raisons de performances.

Voir aussi ce pour plus de détails: http://www.laurentluce.com/posts/python-string-objects-implementation/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X