Python >> Tutoriel Python >  >> Python

Méthode magique Python __repr__()

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