Python >> Tutoriel Python >  >> Python

Python __str__()

Syntaxe

object.__str__(self)

Le Python __str__ La méthode renvoie une représentation sous forme de chaîne de l'objet sur lequel elle est appelée. Par exemple, si vous appelez 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 . Cette méthode est également utilisée pour implémenter le str() intégré fonction.

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.

Arrière-plan str()

str(x) intégré de Python la fonction convertit l'objet x à une chaîne en utilisant le x.__str__() ou, s'il n'existe pas, le repr(x) fonction intégrée pour obtenir la conversion de chaîne.

>>> str(42)
'42'
>>> str(3.14)
'3.14'

# Equivalence of str() and __str__() on lists:
>>> str([1, 2, 3])
'[1, 2, 3]'
>>> [1, 2, 3].__str__()
'[1, 2, 3]'

# Dictionary:
>>> str({'Donna': 33, 'Harvey': 44})
"{'Donna': 33, 'Harvey': 44}"

Exemple personnalisé __str__()

Dans l'exemple suivant, vous créez une classe personnalisée Data et écrasez le __str__() pour qu'elle renvoie une chaîne factice.

class Data:
        
    def __str__(self):
        return '... my result of str ...'


a = Data()

print(str(a))
# ... my result of str ...

Si vous n'aviez pas défini le __str__() méthode, Python aurait utilisé l'implémentation par défaut :

Implémentation par défaut de __str__()

Par défaut, tout objet a un __str__() implémentation de la méthode—afin que vous puissiez représenter n'importe quel objet x en tant que chaîne explicitement en utilisant le str(x) intégré fonction ou l'utiliser implicitement en appelant print(x) .

Cependant, l'implémentation par défaut de __str__() ne fournit que des méta-informations sur l'objet. Par exemple, sur notre objet personnalisé, il fournit la représentation sous forme de chaîne <__main__.Data object at 0x0000028A54B0AFA0> . Cela inclut les informations suivantes :

  • L'emplacement où l'objet est défini (par exemple, __main__ ).
  • Le nom de l'objet (par exemple, Data ).
  • L'emplacement mémoire de l'objet sous forme de nombre hexadécimal (par exemple, 0x0000028A54B0AFA0 ).

Voici un exemple :

class Data:
    pass


a = Data()

print(str(a))
# <__main__.Data object at 0x0000028A54B0AFA0>

__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