Doel van de __repr__-methode?

Wat is de betekenis/het doel van deze methode?


Antwoord 1, autoriteit 100%

__repr__ zou een afdrukbare weergave van het object moeten retourneren, hoogstwaarschijnlijk een van de manieren waarop dit object kan worden gemaakt. Zie de officiële documentatie hier. __repr__ is meer voor ontwikkelaars, terwijl __str__ voor eindgebruikers is.

Een eenvoudig voorbeeld:

>>> class Point:
...   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)

Antwoord 2, autoriteit 11%

Dit wordt goed uitgelegd in de Python-documentatie:

repr(object): Retourneert een tekenreeks die een afdrukbare representatie van een object bevat. Dit is dezelfde waarde die wordt verkregen door conversies (omgekeerde aanhalingstekens). Het is soms handig om toegang te krijgen tot deze bewerking als een gewone functie. Voor veel typen doet deze functie een poging om een ​​tekenreeks te retourneren die een object met dezelfde waarde zou opleveren wanneer het wordt doorgegeven aan eval(), anders is de weergave een tekenreeks tussen punthaken die de naam bevat van het type object samen met aanvullende informatie, vaak inclusief de naam en het adres van het object. Een klasse kan bepalen wat deze functie voor zijn instanties retourneert door een methode __repr__() te definiëren.

Dus wat je hier ziet, is de standaardimplementatie van __repr__, wat handig is voor serialisatie en foutopsporing.


Antwoord 3, autoriteit 7%

__repr__ wordt gebruikt door de zelfstandige Python-interpreter om een ​​klasse in afdrukbaar formaat weer te geven. Voorbeeld:

~> 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__>

In gevallen waar een __str__ methode niet is gedefinieerd in de klasse, zal deze de functie __repr__ aanroepen in een poging een afdrukbare representatie te maken.

>>> str(demo)
'<StackOverflow demo object __repr__>'

Bovendien zal print()het aanroepen van de klas standaard __str__ aanroepen.


Documentatie, alstublieft


Antwoord 4, autoriteit 3%

De methode __repr__ vertelt Python eenvoudig hoe objecten van een klasse moeten worden afgedrukt


Antwoord 5

Een voorbeeld om de verschillen ertussen te zien (ik heb gekopieerd van deze bron),

>>> x=4
>>> repr(x)
'4'
>>> str(x)
'4'
>>> y='stringy'
>>> repr(y)
"'stringy'"
>>> str(y)
'stringy'

De resultaten van repr() en str() zijn identiek voor int x, maar er is een verschil tussen de geretourneerde waarden voor str y — de ene is formeel en de andere is informeel. Een van de belangrijkste verschillen tussen de formele en informele representaties is dat de standaardimplementatie van __repr__ voor een str-waarde kan worden aangeroepen als een argument om te evalueren, en de geretourneerde waarde zou een geldig tekenreeksobject zijn, zoals dit:

>>> repr(y)
"'a string'"
>>> y2=eval(repr(y))
>>> y==y2
True

Als je de retourwaarde van __str__ probeert aan te roepen als argument om te evalueren, is het resultaat niet geldig.


Antwoord 6

Als we nieuwe typen maken door klassen te definiëren, kunnen we profiteren van bepaalde functies van Python om de nieuwe klassen gebruiksvriendelijker te maken. Een van deze functies is “speciale methoden”, ook wel “magische methoden” genoemd.

Speciale methoden hebben namen die beginnen en eindigen met twee onderstrepingstekens. We definiëren ze, maar noemen ze meestal niet direct bij naam. In plaats daarvan worden ze onder specifieke omstandigheden automatisch uitgevoerd.

Het is handig om de waarde van een instantie van een object te kunnen uitvoeren met behulp van een print-instructie. Wanneer we dit doen, willen we dat de waarde in de uitvoer wordt weergegeven in een begrijpelijk, ondubbelzinnig formaat. De speciale methode repr kan worden gebruikt om dit te laten gebeuren. Als we deze methode definiëren, kan deze automatisch worden aangeroepen wanneer we de waarde afdrukken van een instantie van een klasse waarvoor we deze methode hebben gedefinieerd. Er moet echter worden vermeld dat er ook een speciale str-methode is, die wordt gebruikt voor een vergelijkbaar, maar niet identiek doel, die voorrang kan krijgen, als we deze ook hebben gedefinieerd.

Als we de methode repr voor de klasse Point3D niet hebben gedefinieerd, en my_point hebben geïnstantieerd als een instantie van Point3D, en dan doen we dit …

mijn_punt afdrukken
… we kunnen dit zien als de uitvoer …

Niet erg aardig, hè?

Dus, we definiëren de speciale methode repr of str, of beide, om een ​​betere output te krijgen.

**class Point3D(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 automatically
print my_point # __str__ gets called automatically**

Uitvoer …

(1, 2, 3)
(1, 2, 3)


Antwoord 7

Implementeer repr voor elke klasse die u implementeert. Er mag geen excuus zijn.
Implementeer str voor klassen waarvan u denkt dat leesbaarheid belangrijker is dan ondubbelzinnigheid.

Raadpleeg deze link: https://www.pythoncentral.io/what-is-the-difference-between-str-and-repr-in-python/

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes