Syntaxe
object.__repr__(self)
Le Python __repr__
La méthode renvoie une représentation sous forme de chaîne de l'objet sur lequel elle est appelée. Il implémente le repr()
intégré fonction. Si vous appelez le print(x)
un objet x
, Python appelle en interne x.__str__()
pour déterminer la représentation sous forme de chaîne de l'objet x
. Si cela n'est pas implémenté, Python appelle x.__repr__().
Nous appelons cela une "méthode Dunder" pour "D ouble Sous Méthode de score" (également appelée "méthode magique" ). Pour obtenir une liste de toutes les méthodes de dunder avec des explications, consultez notre article sur la feuille de triche de dunder sur ce blog.
Représentation en arrière-plan()
repr(x)
intégré de Python renvoie la représentation standard (canonique) d'un objet.
>>> repr(42) '42' >>> repr('42') "'42'" >>> repr([1, 2, 3]) '[1, 2, 3]' >>> repr({'Alice': 'Bob', 'Bob': 'Alice'}) "{'Alice': 'Bob', 'Bob': 'Alice'}" >>> repr(object) "<class 'object'>" >>> repr(repr) '<built-in function repr>'
Exemple de __repr__ personnalisé
Voulez-vous implémenter une représentation de chaîne personnalisée lors de l'utilisation du repr(object)
fonction sur votre object
personnalisé ?
Pour ce faire, écrasez le object.__repr__()
méthode lors de la définition de la classe et renvoie la représentation sous forme de chaîne souhaitée de l'objet donné.
💡 Notez que si __str__()
est défini, il a priorité sur __repr__()
. Ce dernier n'est utilisé que comme solution de secours implémentée par défaut pour n'importe quel objet.
Examinons un exemple dans lequel les deux méthodes dunder sont définies :
class Car: def __init__(self, color, brand): self.color = color self.brand = brand def __str__(self): return 'Your car has color ' + self.color + ' and brand ' + self.brand def __repr__(self): return '123' porsche = Car('black', 'porsche') tesla = Car('silver', 'tesla') print(str(porsche)) print(str(tesla))
La sortie est :
Your car has color black and brand porsche Your car has color silver and brand tesla
Notez comment __str__
a priorité sur __repr__
.
Pas de __str__() mais __repr__() défini
Si vous ignorez la définition du __str__
méthode, il prendra la chaîne renvoyée par le __repr__
méthode :
class Car: def __init__(self, color, brand): self.color = color self.brand = brand def __repr__(self): return '123' porsche = Car('black', 'porsche') tesla = Car('silver', 'tesla') print(str(porsche)) print(str(tesla))
La sortie est maintenant :
123 123
Ainsi, si vous définissez le __repr__
méthode dunder mais pas le __str__
méthode dunder, le str()
intégré la fonction revient au __repr__()
sortie.
__repr__ contre __str__
La différence entre __str__()
et __repr__()
méthodes est que __str__()
est censé renvoyer un format lisible par l'homme, alors que __repr__()
est censé renvoyer une représentation sous forme de chaîne formelle de l'objet qui devrait être suffisante pour reconstruire l'objet (par exemple, y compris les variables d'état de l'objet).
Voici un exemple :
import datetime now = datetime.datetime.now() print(now.__str__()) # 2021-12-06 11:14:56.285055 print(now.__repr__()) # datetime.datetime(2021, 12, 6, 11, 14, 56, 285055)
💡 La première sortie est un format lisible par l'homme, tandis que la seconde sortie peut être utilisée pour reconstruire l'objet d'origine, par exemple en passant la chaîne de sortie dans le eval()
fonction.
Cependant, les méthodes sont étroitement liées et elles peuvent même s'appeler si l'une d'elles n'est pas implémentée :
Python utilise le __str__()
méthode en priorité lorsqu'il est forcé de convertir un objet en chaîne.
Si __str__()
n'est pas défini, il tente d'appeler __repr__()
.
Seulement si cela n'est pas défini également, il utilise la représentation sous forme de chaîne par défaut de tout objet avec l'adresse mémoire et le nom et l'emplacement de la définition de classe de l'objet.
Voici ce qui se passe si vous définissez __repr__
mais pas __str__
:
class Data: def __repr__(self): return 'finxter' a = Data() print(str(a)) # finxter
Et voici ce qui se passe si les deux méthodes sont définies __str__()
et __repr__()
—Python priorise la définition du __str__()
méthode :
class Data: def __repr__(self): return 'finxter' def __str__(self): return 'python' a = Data() print(a) # python
Le __str__()
La méthode a des arguments plus puissants - vous pouvez en savoir plus dans notre tutoriel de blog détaillé ici.
Références :
- https://docs.python.org/3/reference/datamodel.html