Hoe de __str__() en __repr__() Methoden te Gebruiken in Python

Inleiding

In dit artikel leer je over de speciale methoden __str__() en __repr__() die gedefinieerd zijn in het Python-datamodel. De methoden __str__() en __repr__() kunnen nuttig zijn bij het debuggen van Python-code door het loggen of afdrukken van nuttige informatie over een object.

Speciale methoden in Python beginnen en eindigen met een dubbele underscore en worden informeel aangeduid als dunder-methoden. Dunder-methoden zijn de onderliggende methoden voor de ingebouwde operatoren en functies van Python. Je moet vermijden om dunder-methoden rechtstreeks aan te roepen, en in plaats daarvan de dunder-methoden implementeren in je klasse en vervolgens de ingebouwde functies gebruiken die ze aanroepen, zoals str() en repr().

Wat is het verschil tussen __str__() en __repr__()?

De methode __str__() retourneert een menselijk leesbare, of informele, stringrepresentatie van een object. Deze methode wordt aangeroepen door de ingebouwde print(), str(), en format() functies. Als je geen __str__() methode definieert voor een klasse, dan roept de ingebouwde objectimplementatie in plaats daarvan de __repr__() methode aan.

De __repr__() methode retourneert een meer informatie-rijke, of officiële, stringrepresentatie van een object. Deze methode wordt aangeroepen door de ingebouwde repr() functie. Indien mogelijk moet de geretourneerde string een geldige Python expressie zijn die kan worden gebruikt om het object opnieuw te creëren. In alle gevallen moet de string informatief en ondubbelzinnig zijn.

In het algemeen is de __str__() string bedoeld voor gebruikers en de __repr__() string is bedoeld voor ontwikkelaars.

Voorbeelden van __str__() en __repr__() Gebruik met een Ingebouwde Klasse

De voorbeelden in deze sectie roepen de __str__() en __repr__() methoden rechtstreeks aan ter illustratie.

De datetime.datetime klasse is een ingebouwde Python klasse die een standaardimplementatie heeft van de __str__() en __repr__() methoden.

Het volgende voorbeeld toont de strings die worden geretourneerd door de standaardimplementatie van de __str__() en __repr__() methoden voor een datetime.datetime object:

import datetime

mydate = datetime.datetime.now()

print("__str__() string: ", mydate.__str__())
print("str() string: ", str(mydate))

print("__repr__() string: ", mydate.__repr__())
print("repr() string: ", repr(mydate))

De output is:

Output
__str__() string: 2023-01-27 09:50:37.429078 str() string: 2023-01-27 09:50:37.429078 __repr__() string: datetime.datetime(2023, 1, 27, 9, 50, 37, 429078) repr() string: datetime.datetime(2023, 1, 27, 9, 50, 37, 429078)

De output laat zien dat de str() functie __str__() aanroept en een mensvriendelijke string retourneert, terwijl de repr() functie __repr__() aanroept en een meer informatie-rijke string retourneert die gebruikt kan worden om het object te recreëren. In feite kan je de repr() functie met de eval() functie gebruiken om een nieuw object te creëren uit de string:

import datetime

mydate1 = datetime.datetime.now()
mydate2 = eval(repr(mydate1))

print("mydate1 repr() string: ", repr(mydate1))
print("mydate2 repr() string: ", repr(mydate2))

print("the values of the objects are equal: ", mydate1==mydate2)

De output is:

Output
mydate1 repr() string: datetime.datetime(2023, 1, 26, 9, 43, 24, 479635) mydate2 repr() string: datetime.datetime(2023, 1, 26, 9, 43, 24, 479635) the values of the objects are equal: True

Het voorgaande voorbeeldcode creëert het mydate2 object uit de repr() string voor mydate1, en verifieert vervolgens dat de waarden van beide objecten gelijk zijn.

__str__() en __repr__() Voorbeelden met een Nieuwe Klasse

Wanneer je een klasse maakt, moet je minstens de ___repr__() methode implementeren zodat nuttige informatie wordt geretourneerd wanneer ingebouwde functies __repr__() gebruiken.

De volgende klasse implementeert de __str__() of __repr()__ methoden niet:

class Ocean:

    def __init__(self, sea_creature_name, sea_creature_age):
        self.name = sea_creature_name
        self.age = sea_creature_age

c = Ocean('Jellyfish', 5)

print(str(c))
print(repr(c))

De output bij gebruik van str() en repr() is:

Output
<__main__.Ocean object at 0x102892860> <__main__.Ocean object at 0x102892860>

Het voorgaande voorbeeld toont aan dat de standaardimplementatie van `__repr()__` voor het object een string retourneert met alleen de klasse en het object `id` in hexadecimale indeling, wat niet erg nuttig is. Merk op dat `str()` en `repr()` dezelfde waarde retourneren, omdat `str()` `__repr__()` aanroept wanneer `__str__()` niet geïmplementeerd is.

Werk de Ocean-klasse bij met implementaties van de `__str__()` en `__repr__()` methoden:

class Ocean:

    def __init__(self, sea_creature_name, sea_creature_age):
        self.name = sea_creature_name
        self.age = sea_creature_age
    
    def __str__(self):
        return f'The creature type is {self.name} and the age is {self.age}'

    def __repr__(self):
        return f'Ocean(\'{self.name}\', {self.age})'

c = Ocean('Jellyfish', 5)

print(str(c))
print(repr(c))

De uitvoer is:

Output
The creature type is Jellyfish and the age is 5 Ocean('Jellyfish', 5)

De implementatie van `__str__()` in het bovenstaande voorbeeld retourneert een eenvoudig te lezen string die de relevante details van het object voor een gebruiker biedt. De implementatie van `__repr__()` retourneert een string die een geldige Python-uitdrukking is die kan worden gebruikt om het object opnieuw te maken: `Ocean(‘Jellyfish’, 5)`. Het voorbeeld maakt gebruik van f-string-opmaak voor de strings, maar u kunt de strings formatteren met elke indeling die wordt ondersteund door Python.

Conclusie

In dit artikel heb je de verschillen onderzocht tussen de __str__() en de __repr__() methoden en deze speciale methoden geïmplementeerd in een klasse, zodat je ze niet direct hoefde aan te roepen. Leer meer over het werken met strings in Python via onze Python string tutorials.

Source:
https://www.digitalocean.com/community/tutorials/python-str-repr-functions