Pour les développeurs Java qui apprennent Python, la meilleure façon de voir cela est d'utiliser toString () en Java.
Ravi
Réponses:
189
__repr__doit renvoyer une représentation imprimable de l'objet, probablement l' une des manières possibles de créer cet objet. Voir la documentation officielle ici . __repr__est plus pour les développeurs que __str__pour les utilisateurs finaux.
Un exemple simple:
>>>classPoint:...def __init__(self, x, y):... self.x, self.y = x, y
...def __repr__(self):...return'Point(x=%s, y=%s)'%(self.x, self.y)>>> p =Point(1,2)>>> p
Point(x=1, y=2)
lazy1: Je voulais principalement corriger le formatage (il est utile que les exemples correspondent le plus possible à ce qu'ils verront dans une session d'exemple), mais j'ai également modifié le format de sortie pour qu'il soit explicitement différent de l'affectation, car cela améliore grandement la clarté pour quelqu'un confus à ce sujet, à mon humble avis. (Si je suis allé trop loin, rééditez simplement et je vous dois une bière.)
Ce n'est pas vraiment correct. __str__est la sortie qui est censée être lisible par l'homme: __repr__est censée être une représentation lisible par l'interpréteur Python (c'est-à-dire que fournir la chaîne à l'interpréteur devrait recréer l'objet). Si un objet n'a pas de __str__méthode, cependant, __repr__est utilisé à la place. Aussi comme noté: cet exemple imprime en fait la __str__méthode de self.xet self.y: %rdevrait être utilisé à la place de %sl'opération de formatage de chaîne (puisque la classe ne définit pas __str__, __repr__est en fait retournée de toute façon, mais c'est une anomalie).
repr ( object ): renvoie une chaîne contenant une représentation imprimable d'un objet. C'est la même valeur produite par les conversions (guillemets inversés). Il est parfois utile de pouvoir accéder à cette opération comme une fonction ordinaire. Pour de nombreux types, cette fonction tente de renvoyer une chaîne qui donnerait un objet avec la même valeur lorsqu'elle est passée à eval(), sinon la représentation est une chaîne entre crochets qui contient le nom du type de l'objet avec des informations supplémentaires comprenant souvent le nom et l'adresse de l'objet. Une classe peut contrôler ce que cette fonction renvoie pour ses instances en définissant une __repr__()méthode.
Donc, ce que vous voyez ici est l'implémentation par défaut de __repr__, qui est utile pour la sérialisation et le débogage.
Je pense que la méthode des guillemets inversés (ou 'backticks') pour obtenir la "représentation" d'un objet est obsolète et a été supprimée pour la version 3.0
MatrixFrog
MatrixFrog: les deux sont vrais, mais la documentation 2.x actuelle le dit toujours, d'où vient la citation.
Pour de nombreux objets, __repr__ et __str__ ont la même fonction. En fait, si vous ne définissez que __str__, __repr__ par défaut n'appelle que __str__. Le cas le plus évident où ce n'est pas vrai est celui des chaînes elles-mêmes: str ('stackoverflow') renvoie stackoverflowmais repr ('stackoverflow') l'est 'stackoverflow'.
MatrixFrog
6
Vous avez cela à l'envers, __repr__ n'utilise jamais __str__, mais l'inverse peut se produire. Voir docs.python.org/reference
13
__repr__est utilisé par l'interpréteur Python autonome pour afficher une classe au format imprimable. Exemple:
~> python3.5
Python 3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> class StackOverflowDemo:
... def __init__(self):
... pass
... def __repr__(self):
... return '<StackOverflow demo object __repr__>'
...
>>> demo = StackOverflowDemo()
>>> demo
<StackOverflow demo object __repr__>
Dans les cas où une __str__méthode n'est pas définie dans la classe, elle appellera la __repr__fonction pour tenter de créer une représentation imprimable.
Les retours de repr()et str()sont identiques pour int x, mais il y a une différence entre les valeurs de retour pour stry- l'un est formel et l'autre est informel . L'une des différences les plus importantes entre les représentations formelles et informelles est que l'implémentation par défaut de __repr__pour une valeur str peut être appelée en tant qu'argument pour eval, et la valeur de retour serait un objet chaîne valide, comme ceci:
Lorsque nous créons de nouveaux types en définissant des classes, nous pouvons profiter de certaines fonctionnalités de Python pour rendre les nouvelles classes pratiques à utiliser. L'une de ces caractéristiques est les «méthodes spéciales», également appelées «méthodes magiques».
Les méthodes spéciales ont des noms qui commencent et se terminent par deux traits de soulignement. Nous les définissons, mais nous ne les appelons généralement pas directement par leur nom. Au lieu de cela, ils s'exécutent automatiquement dans des circonstances spécifiques.
Il est pratique de pouvoir afficher la valeur d'une instance d'un objet à l'aide d'une instruction d'impression. Lorsque nous faisons cela, nous aimerions que la valeur soit représentée dans la sortie dans un format compréhensible et non ambigu. La méthode spéciale repr peut être utilisée pour faire en sorte que cela se produise. Si nous définissons cette méthode, elle peut être appelée automatiquement lorsque nous imprimons la valeur d'une instance d'une classe pour laquelle nous avons défini cette méthode. Il faut cependant mentionner qu'il existe également une méthode spéciale str , utilisée dans un but similaire, mais pas identique, qui peut avoir la priorité, si nous l'avons également définie.
Si nous n'avons pas défini, la méthode repr pour la classe Point3D, et avons instancié my_point en tant qu'instance de Point3D, puis nous faisons ceci ...
print my_point ... nous pouvons voir cela comme la sortie ...
Pas très gentil, hein?
Donc, nous définissons la méthode spéciale repr ou str , ou les deux, pour obtenir un meilleur résultat.
**classPoint3D(object):def __init__(self,a,b,c):
self.x = a
self.y = b
self.z = c
def __repr__(self):return"Point3D(%d, %d, %d)"%(self.x, self.y, self.z)def __str__(self):return"(%d, %d, %d)"%(self.x, self.y, self.z)
my_point =Point3D(1,2,3)print my_point # __repr__ gets called automaticallyprint my_point # __str__ gets called automatically**
Implémentez repr pour chaque classe que vous implémentez. Il ne devrait y avoir aucune excuse. Implémentez str pour les classes dont vous pensez que la lisibilité est plus importante que la non-ambiguïté.
>>> variable
imprime ce qui__repr__()
retourne?Réponses:
__repr__
doit renvoyer une représentation imprimable de l'objet, probablement l' une des manières possibles de créer cet objet. Voir la documentation officielle ici .__repr__
est plus pour les développeurs que__str__
pour les utilisateurs finaux.Un exemple simple:
la source
__str__
est la sortie qui est censée être lisible par l'homme:__repr__
est censée être une représentation lisible par l'interpréteur Python (c'est-à-dire que fournir la chaîne à l'interpréteur devrait recréer l'objet). Si un objet n'a pas de__str__
méthode, cependant,__repr__
est utilisé à la place. Aussi comme noté: cet exemple imprime en fait la__str__
méthode deself.x
etself.y
:%r
devrait être utilisé à la place de%s
l'opération de formatage de chaîne (puisque la classe ne définit pas__str__
,__repr__
est en fait retournée de toute façon, mais c'est une anomalie).Ceci est assez bien expliqué dans la documentation Python :
Donc, ce que vous voyez ici est l'implémentation par défaut de
__repr__
, qui est utile pour la sérialisation et le débogage.la source
stackoverflow
mais repr ('stackoverflow') l'est'stackoverflow'
.__repr__
est utilisé par l'interpréteur Python autonome pour afficher une classe au format imprimable. Exemple:Dans les cas où une
__str__
méthode n'est pas définie dans la classe, elle appellera la__repr__
fonction pour tenter de créer une représentation imprimable.De plus,
print()
la classe appellera__str__
par défaut.Documentation , s'il vous plaît
la source
La méthode __repr__ indique simplement à Python comment imprimer les objets d'une classe
la source
Un exemple pour voir les différences entre eux (j'ai copié à partir de cette source ),
Les retours de
repr()
etstr()
sont identiques pourint x
, mais il y a une différence entre les valeurs de retour pourstr
y
- l'un est formel et l'autre est informel . L'une des différences les plus importantes entre les représentations formelles et informelles est que l'implémentation par défaut de__repr__
pour une valeur str peut être appelée en tant qu'argument pour eval, et la valeur de retour serait un objet chaîne valide, comme ceci:Si vous essayez d'appeler la valeur de retour de
__str__
comme argument à eval, le résultat ne sera pas valide.la source
Lorsque nous créons de nouveaux types en définissant des classes, nous pouvons profiter de certaines fonctionnalités de Python pour rendre les nouvelles classes pratiques à utiliser. L'une de ces caractéristiques est les «méthodes spéciales», également appelées «méthodes magiques».
Les méthodes spéciales ont des noms qui commencent et se terminent par deux traits de soulignement. Nous les définissons, mais nous ne les appelons généralement pas directement par leur nom. Au lieu de cela, ils s'exécutent automatiquement dans des circonstances spécifiques.
Il est pratique de pouvoir afficher la valeur d'une instance d'un objet à l'aide d'une instruction d'impression. Lorsque nous faisons cela, nous aimerions que la valeur soit représentée dans la sortie dans un format compréhensible et non ambigu. La méthode spéciale repr peut être utilisée pour faire en sorte que cela se produise. Si nous définissons cette méthode, elle peut être appelée automatiquement lorsque nous imprimons la valeur d'une instance d'une classe pour laquelle nous avons défini cette méthode. Il faut cependant mentionner qu'il existe également une méthode spéciale str , utilisée dans un but similaire, mais pas identique, qui peut avoir la priorité, si nous l'avons également définie.
Si nous n'avons pas défini, la méthode repr pour la classe Point3D, et avons instancié my_point en tant qu'instance de Point3D, puis nous faisons ceci ...
print my_point ... nous pouvons voir cela comme la sortie ...
Pas très gentil, hein?
Donc, nous définissons la méthode spéciale repr ou str , ou les deux, pour obtenir un meilleur résultat.
Production ...
(1, 2, 3) (1, 2, 3)
la source
Implémentez repr pour chaque classe que vous implémentez. Il ne devrait y avoir aucune excuse. Implémentez str pour les classes dont vous pensez que la lisibilité est plus importante que la non-ambiguïté.
Reportez-vous à ce lien: https://www.pythoncentral.io/what-is-the-difference-between- str -and- repr -in-python /
la source