Ich verstehe wirklich nicht, wo __str__
und __repr__
in Python verwendet. Ich meine, ich bekomme, dass __str__
die Zeichenfolgendarstellung eines Objekts zurückgegeben wird. Aber warum sollte ich das brauchen? In welchem Anwendungsfall? Außerdem habe ich über die Verwendung von gelesen__repr__
Aber was ich nicht verstehe ist, wo würde ich sie verwenden?
__str__
=to_s
und__repr__
=inspect
.Antworten:
__repr__
__str__
Verwenden
__str__
Sie diese Option, wenn Sie eine Klasse haben und eine informative / informelle Ausgabe wünschen, wenn Sie dieses Objekt als Teil einer Zeichenfolge verwenden. Sie können beispielsweise__str__
Methoden für Django-Modelle definieren, die dann in der Django-Verwaltungsoberfläche gerendert werden. Anstelle von so etwas erhalten<Model object>
Sie den Vor- und Nachnamen einer Person, den Namen und das Datum eines Ereignisses usw.__repr__
und__str__
sind ähnlich, in der Tat manchmal gleich (Beispiel aus derBaseSet
Klasse insets.py
der Standardbibliothek):def __repr__(self): """Return string representation of a set. This looks like 'Set([<list of elements>])'. """ return self._repr() # __str__ is the same as __repr__ __str__ = __repr__
quelle
__repr__
anstelle von__str__
Django verwenden?Der einzige Ort, an dem Sie beide häufig verwenden, ist eine interaktive Sitzung. Wenn Sie ein Objekt drucken, wird seine
__str__
Methode aufgerufen. Wenn Sie nur ein Objekt selbst verwenden,__repr__
wird Folgendes angezeigt:>>> from decimal import Decimal >>> a = Decimal(1.25) >>> print(a) 1.25 <---- this is from __str__ >>> a Decimal('1.25') <---- this is from __repr__
Das
__str__
soll so gut wie möglich lesbar sein, während das__repr__
Ziel sein sollte, etwas zu sein, mit dem das Objekt neu erstellt werden kann, obwohl es oft nicht genau so ist, wie es erstellt wurde, wie in diesem Fall.Es ist auch nicht ungewöhnlich für beide
__str__
und__repr__
denselben Wert zurück ( auf jeden Fall für integrierte Typen).quelle
Heuschrecke, wenn Sie Zweifel haben, gehen Sie zum Berg und lesen Sie die alten Texte . In ihnen finden Sie, dass __repr __ ():
quelle
__repr__
, die offiziellen Dokumente beantworten die Frage, warum Sie sie verwenden würden, nicht wirklich, und nur weil eine Frage an anderer Stelle beantwortet wird, ist dies kein guter Grund, es nicht auch zu sein auf SO beantwortet (so oft wie nicht Googeln bringt Sie hierher zurück!) Wenn Sie nicht der Meinung sind, dass die Frage eine Antwort wert ist, können Sie sie einfach nicht beantworten, obwohl ich in diesem Fall zustimme, dass sie bereits sehr gut behandelt wird Eine Verknüpfung mit Duplikaten wäre daher eine angemessene Antwort.Aufbauend auf den vorherigen Antworten und Zeigen einiger weiterer Beispiele. Bei sachgemäßer Verwendung ist der Unterschied zwischen
str
undrepr
klar. Kurz gesagt,repr
sollte eine Zeichenfolge zurückgegeben werden, die kopiert werden kann, um den genauen Status des Objekts wiederherzustellen, währendstr
dies für das Debuggenlogging
undobserving
Debuggen von Ergebnissen nützlich ist . Hier sind einige Beispiele, um die verschiedenen Ausgaben für einige bekannte Bibliotheken zu sehen.Terminzeit
print repr(datetime.now()) #datetime.datetime(2017, 12, 12, 18, 49, 27, 134411) print str(datetime.now()) #2017-12-12 18:49:27.134452
Das
str
ist gut, um in eine Protokolldatei zu drucken, worepr
dies zweckentfremdet werden kann, wenn Sie es direkt ausführen oder als Befehle in eine Datei kopieren möchten.x = datetime.datetime(2017, 12, 12, 18, 49, 27, 134411)
Numpy
print repr(np.array([1,2,3,4,5])) #array([1, 2, 3, 4, 5]) print str(np.array([1,2,3,4,5])) #[1 2 3 4 5]
in Numpy
repr
ist das wieder direkt verbrauchbar.Beispiel für einen benutzerdefinierten Vektor3
class Vector3(object): def __init__(self, args): self.x = args[0] self.y = args[1] self.z = args[2] def __str__(self): return "x: {0}, y: {1}, z: {2}".format(self.x, self.y, self.z) def __repr__(self): return "Vector3([{0},{1},{2}])".format(self.x, self.y, self.z)
In diesem Beispiel wird
repr
erneut eine Zeichenfolge zurückgegeben, die direkt verwendet / ausgeführt werden kann, währendstr
dies als Debug-Ausgabe nützlicher ist.v = Vector3([1,2,3]) print str(v) #x: 1, y: 2, z: 3 print repr(v) #Vector3([1,2,3])
quelle
Lassen Sie uns eine Klasse ohne
__str__
Funktion haben.class Employee: def __init__(self, first, last, pay): self.first = first self.last = last self.pay = pay emp1 = Employee('Ivan', 'Smith', 90000) print(emp1)
Wenn wir diese Instanz der Klasse drucken
emp1
, erhalten wir Folgendes:<__main__.Employee object at 0x7ff6fc0a0e48>
Dies ist nicht sehr hilfreich, und dies ist sicherlich nicht das, was wir drucken möchten, wenn wir es zur Anzeige verwenden (wie in HTML).
Also jetzt die gleiche Klasse, aber mit
__str__
Funktion:class Employee: def __init__(self, first, last, pay): self.first = first self.last = last self.pay = pay def __str__(self): return(f"The employee {self.first} {self.last} earns {self.pay}.") # you can edit this and use any attributes of the class emp2 = Employee('John', 'Williams', 90000) print(emp2)
Anstatt zu drucken, dass es ein Objekt gibt, erhalten wir jetzt das, was wir mit der Rückgabe der
__str__
Funktion angegeben haben:The employee John Williams earns 90000
quelle
str
wird ein informelles und lesbares Format sein, währendrepr
eine offizielle Objektdarstellung gegeben wird.class Complex: # Constructor def __init__(self, real, imag): self.real = real self.imag = imag # "official" string representation of an object def __repr__(self): return 'Rational(%s, %s)' % (self.real, self.imag) # "informal" string representation of an object (readable) def __str__(self): return '%s + i%s' % (self.real, self.imag) t = Complex(10, 20) print (t) # this is usual way we print the object print (str(t)) # this is str representation of object print (repr(t)) # this is repr representation of object Answers : Rational(10, 20) # usual representation 10 + i20 # str representation Rational(10, 20) # repr representation
quelle
str und repr sind beide Darstellungsweisen. Sie können sie verwenden, wenn Sie eine Klasse schreiben.
class Fraction: def __init__(self, n, d): self.n = n self.d = d def __repr__(self): return "{}/{}".format(self.n, self.d)
Wenn ich beispielsweise eine Instanz davon drucke, werden Dinge zurückgegeben.
print(Fraction(1, 2))
führt zu
1/2
während
class Fraction: def __init__(self, n, d): self.n = n self.d = d def __str__(self): return "{}/{}".format(self.n, self.d) print(Fraction(1, 2))
führt auch zu
1/2
Aber was ist, wenn Sie beide schreiben, welches verwendet Python?
class Fraction: def __init__(self, n, d): self.n = n self.d = d def __str__(self): return "str" def __repr__(self): return "repr" print(Fraction(None, None))
Das führt zu
Python verwendet also tatsächlich die str- Methode und nicht die repr- Methode, wenn beide geschrieben sind.
quelle