web-dev-qa-db-fra.com

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

En Java, je peux remplacer la méthode toString() de ma classe. Ensuite, la fonction d'impression de Java imprime la représentation sous forme de chaîne de l'objet défini par sa toString(). Existe-t-il un Python équivalent au toString() de Java?

Par exemple, j'ai une classe PlayCard. J'ai un exemple 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 personnaliser la représentation sous forme de chaîne de mes instances de classe?

J'utilise Python 3.x

189
snakile

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:

249
Mark Byers

Ce n’est pas aussi facile qu’il semble, certaines fonctions principales de la bibliothèque ne fonctionnent pas lorsque seulement str est écrasé (vérifié avec Python 2.7), voir ce fil pour des exemples Comment rendre une classe JSON sérialisable Essayez aussi 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 pouvait s'y attendre.

EDIT: répondant au commentaire de mchicago:

unicode n'a pas d'attribut - c'est une chaîne immuable, dont la valeur est cachée et non disponible dans le code Python de haut niveau. Le module json utilise re pour générer la représentation sous forme de chaîne qui semble avoir accès à cet attribut interne. Voici un exemple simple pour justifier cela:

b = A('b') print b

produit

'a'

tandis que

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

produit

{"b": "b"}

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

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

31
seeg