Comment imprimer des instances d'une classe à l'aide de print()?
Je suis en train d'apprendre les ficelles du métier en Python. Lorsque j'essaie d'imprimer un objet de la classe Foobar
à l'aide de la print()
fonction, je obtenir un résultat comme ceci:
<__main__.Foobar instance at 0x7ff2a18c>
Est-il un moyen que je puisse régler le impression comportement (ou le représentation de chaîne) d'un classe et ses objets? Par exemple, quand je l'appelle print()
sur un objet de classe, je voudrais imprimer ses membres de données dans un certain format. Comment atteindre cet objectif en Python?
Si vous êtes familier avec des classes C++, le ci-dessus peut être réalisé pour la norme ostream
par l'ajout d'un friend ostream& operator << (ostream&, const Foobar&)
méthode pour la classe.
Vous devez vous connecter pour publier un commentaire.
La
__str__
méthode est ce qui se passe lors de l'impression, et la__repr__
méthode est ce qui arrive lorsque vous utilisez lerepr()
fonction (ou quand vous le regardez avec l'invite de commandes). Si ce n'est pas le plus Pythonic méthode, je m'excuse, parce que je suis encore à apprendre trop, mais il fonctionne.Si aucune
__str__
la méthode est donnée, Python imprimer le résultat de__repr__
à la place. Si vous définissez__str__
mais pas__repr__
, Python va utiliser ce que vous voyez ci-dessus que la__repr__
, mais toujours utiliser__str__
pour l'impression.Comme Chris Lutz mentionné, il est défini par le
__repr__
méthode dans votre classe.À partir de la documentation de
repr()
:Suivants de la classe de Test:
..il s'agira de la manière suivante dans l'interface Python:
Si aucune
__str__
méthode est définie,print(t)
(ouprint(str(t))
) va utiliser le résultat de__repr__
au lieuSi aucune
__repr__
méthode est définie, la valeur par défaut est utilisé, qui est à peu près équivalent à..__str__
est différente de la shell interactif résultats que vous donnez. 😛%
chaîne de formatage n'est pas obsolète, à partir de docs.python.org/whatsnew/2.6.html "l'opérateur % est complétées par un plus puissant chaîne de formatage de la méthode format()"%
's été très pratique.print([Test(123)])
Une méthode générique qui peut être appliquée à toute la classe sans mise en forme spécifique pourrait être fait comme suit:
Et puis,
produit
Si vous êtes dans une situation comme @Keith vous pourriez essayer:
Il va à l'encontre de ce que je considère bon style, mais si vous êtes juste essayer de déboguer alors il devrait faire ce que vous voulez.
Juste pour ajouter mon grain de sel à @dbr réponse, voici un exemple de la façon de mettre cette phrase à partir de la documentation officielle qu'il a citées:
Donné cette définition de classe:
Maintenant, il est facile à sérialiser instance de
Test
classe:Donc, l'exécution dernier morceau de code, nous allons obtenir:
Mais, comme je l'ai dit dans mon dernier commentaire: plus d'info est juste ici!
Vous devez utiliser
__repr__
. C'est une fonction standard comme__init__
.Par exemple:
Un joli version de réponse par @user394430
Produit visuellement agréable liste des noms et des valeurs.
Un même éleveur version (merci Ruud) trie les éléments:
Pour Python 3:
Si le format n'est pas important (par exemple, pour le débogage) vient d'hériter de la possibilité d'imprimer la classe ci-dessous. Pas besoin d'écrire du code pour chaque objet.
Inspiré par cette réponse
Il y a déjà beaucoup de réponses dans ce fil, mais aucun d'eux en particulier m'a aidé, j'ai du travail moi-même, donc j'espère que celui-ci est un peu plus instructif.
Vous avez juste à vous assurer que vous avez entre parenthèses à la fin de votre classe, de l'e.g:
Voici un exemple de code à partir d'un projet que je travaillais sur:
Pour l'impression de mes Hydrogène classe, j'ai utilisé les éléments suivants:
Veuillez noter que cela ne fonctionnera pas sans les parenthèses à la fin de l'Hydrogène. Ils sont nécessaires.
Espère que cette aide, laissez-moi savoir si vous avez plus des questions.