En Java, si j'appelle List.toString (), il appellera automatiquement la méthode toString () sur chaque objet à l'intérieur de List. Par exemple, si ma liste contient les objets o1, o2 et o3, list.toString () ressemblerait à ceci:
"[" + o1.toString() + ", " + o2.toString() + ", " + o3.toString() + "]"
Existe-t-il un moyen d'obtenir un comportement similaire en Python? J'ai implémenté une méthode __str __ () dans ma classe, mais lorsque j'imprime une liste d'objets, en utilisant:
print 'my list is %s'%(list)
ça ressemble à quelque chose comme ça:
[<__main__.cell instance at 0x2a955e95f0>, <__main__.cell instance at 0x2a955e9638>, <__main__.cell instance at 0x2a955e9680>]
comment puis-je faire en sorte que python appelle automatiquement mon __str__ pour chaque élément de la liste (ou dict d'ailleurs)?
Réponses:
L'appel de chaîne sur une liste python appelle la
__repr__
méthode sur chaque élément à l'intérieur. Pour certains articles,__str__
et__repr__
sont les mêmes. Si vous voulez ce comportement, faites:la source
__str__
avec__repr__
n'est généralement pas conforme au modèle de données Python , donc la solution de compréhension de liste proposée par @ daniel-lew est plus pythonique.str()
sur une liste renvoyéestr()
pour chacun des éléments individuels à l'intérieur.Vous pouvez utiliser une compréhension de liste pour générer une nouvelle liste avec chaque élément str () 'd automatiquement:
la source
print(map(str, mylist))
- c'est un tout petit peu plus courtDeux choses simples que vous pouvez faire, utiliser la
map
fonction ou utiliser une compréhension.Mais cela vous donne une liste de chaînes, pas une chaîne. Vous devez donc également joindre les chaînes ensemble.
ou
Ensuite, vous pouvez imprimer cet objet de chaîne composite.
la source
Selon ce que vous souhaitez utiliser cette sortie, peut
__repr__
-être peut-être plus approprié:la source
Je suis d'accord avec la réponse précédente sur l'utilisation de la compréhension de liste pour ce faire, mais vous pouvez certainement cacher cela derrière une fonction, si c'est ce qui fait flotter votre bateau.
Juste pour le plaisir, j'ai créé list_str () récursivement str () tout ce qui est contenu dans la liste.
la source
__str__
et__repr__
séparémentQuelque chose comme ça?
la source
Cela devrait suffire.
Lors de l'impression de listes ainsi que d'autres classes de conteneurs, les éléments contenus seront imprimés en utilisant
__repr__
, car il__repr__
est destiné à être utilisé pour la représentation d'objet interne. Si nous appelons:help(object.__repr__)
cela nous dira:Et si nous l'appelons,
help(repr)
il affichera:Si
__str__
est implémenté pour un objet et__repr__
ne l'est pasrepr(obj)
, la sortie par défaut est générée, commeprint(obj)
si aucune de celles-ci n'est implémentée.Donc, le seul moyen est de mettre en œuvre
__repr__
pour votre classe. Une façon possible de le faire est la suivante:la source
La sortie que vous obtenez est simplement le nom du module de l'objet, le nom de la classe, puis l'adresse mémoire en hexadécimal car la
__repr__
fonction n'est pas remplacée.__str__
est utilisé pour la représentation sous forme de chaîne d'un objet lors de l'utilisation de print. Mais puisque vous imprimez une liste d'objets et que vous n'effectuez pas une itération sur la liste pour appeler lastr
méthode pour chaque élément, il imprime la représentation des objets.Pour que la
__str__
fonction soit appelée, vous devez faire quelque chose comme ceci:Si vous remplacez la
__repr__
fonction, vous pouvez utiliser la méthode d'impression comme vous l'étiez auparavant:Ensuite, vous obtiendrez "
my list is [1, 2, 3]
" comme sortie.la source