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
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:
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/