def __repr__(self):
return '<%s %s (%s:%s) %s>' % (
self.__class__.__name__, self.urlconf_name, self.app_name,
self.namespace, self.regex.pattern)
Welche Bedeutung / welchen Zweck hat diese Methode?
def __repr__(self):
return '<%s %s (%s:%s) %s>' % (
self.__class__.__name__, self.urlconf_name, self.app_name,
self.namespace, self.regex.pattern)
Welche Bedeutung / welchen Zweck hat diese Methode?
Antworten:
__repr__sollte eine druckbare Darstellung des Objekts zurückgeben, höchstwahrscheinlich eine der Möglichkeiten, dieses Objekt zu erstellen. Siehe offizielle Dokumentation hier . __repr__ist mehr für Entwickler, während __str__es für Endbenutzer ist.
Ein einfaches Beispiel:
>>> 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)
__str__ist die Ausgabe, die für Menschen lesbar sein soll: __repr__soll eine für den Python-Interpreter lesbare Darstellung sein (dh das Zuführen der Zeichenfolge zum Interpreter sollte das Objekt neu erstellen). Wenn ein Objekt jedoch keine __str__Methode hat, __repr__wird stattdessen verwendet. Ebenfalls wie erwähnt: In diesem Beispiel wird tatsächlich die __str__Methode von self.xund self.y: gedruckt, die %ranstelle der %sFormatierungsoperation für Zeichenfolgen verwendet werden sollte (da die Klasse nicht definiert __str__, __repr__wird sie tatsächlich zurückgegeben, es handelt sich jedoch um eine Anomalie).
Dies wird in der Python-Dokumentation recht gut erklärt :
repr ( Objekt ): Gibt eine Zeichenfolge zurück, die eine druckbare Darstellung eines Objekts enthält. Dies ist der gleiche Wert, der durch Conversions (umgekehrte Anführungszeichen) erzielt wird. Es ist manchmal nützlich, als normale Funktion auf diesen Vorgang zugreifen zu können. Bei vielen Typen versucht diese Funktion, eine Zeichenfolge zurückzugeben, die bei Übergabe ein Objekt mit demselben Wert ergibt
eval(). Andernfalls handelt es sich bei der Darstellung um eine Zeichenfolge in spitzen Klammern, die den Namen des Objekttyps zusammen mit zusätzlichen Informationen enthält oft einschließlich des Namens und der Adresse des Objekts. Eine Klasse kann steuern, was diese Funktion für ihre Instanzen zurückgibt, indem sie eine__repr__()Methode definiert.
Was Sie hier sehen, ist die Standardimplementierung von __repr__, die für die Serialisierung und das Debuggen nützlich ist.
stackoverflow, repr ('stackoverflow') jedoch 'stackoverflow'.
__repr__wird vom eigenständigen Python-Interpreter verwendet, um eine Klasse im druckbaren Format anzuzeigen. Beispiel:
~> 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 Fällen, in denen eine __str__Methode nicht in der Klasse definiert ist, wird die __repr__Funktion aufgerufen , um eine druckbare Darstellung zu erstellen.
>>> str(demo)
'<StackOverflow demo object __repr__>'
Außerdem wird print()die Klasse __str__standardmäßig aufgerufen .
Dokumentation , bitte
Die __repr__ -Methode teilt Python einfach mit, wie Objekte einer Klasse gedruckt werden sollen
Ein Beispiel, um die Unterschiede zwischen ihnen zu sehen (ich habe aus dieser Quelle kopiert ),
>>> x=4
>>> repr(x)
'4'
>>> str(x)
'4'
>>> y='stringy'
>>> repr(y)
"'stringy'"
>>> str(y)
'stringy'
Die Rückgaben von repr()und str()sind identisch für int x, aber es gibt einen Unterschied zwischen den Rückgabewerten für str y- einer ist formal und der andere ist informell . Einer der wichtigsten Unterschiede zwischen der formellen und der informellen Darstellung besteht darin, dass die Standardimplementierung __repr__für einen str-Wert als Argument für die Bewertung aufgerufen werden kann und der Rückgabewert ein gültiges Zeichenfolgenobjekt wie folgt wäre:
>>> repr(y)
"'a string'"
>>> y2=eval(repr(y))
>>> y==y2
True
Wenn Sie versuchen, den Rückgabewert von __str__als Argument für eval aufzurufen , ist das Ergebnis nicht gültig.
Wenn wir neue Typen erstellen, indem wir Klassen definieren, können wir bestimmte Funktionen von Python nutzen, um die Verwendung der neuen Klassen zu vereinfachen. Eine dieser Eigenschaften sind "spezielle Methoden", auch als "magische Methoden" bezeichnet.
Spezielle Methoden haben Namen, die mit zwei Unterstrichen beginnen und enden. Wir definieren sie, nennen sie aber normalerweise nicht direkt beim Namen. Stattdessen werden sie unter bestimmten Umständen automatisch ausgeführt.
Es ist praktisch, den Wert einer Instanz eines Objekts mithilfe einer print-Anweisung ausgeben zu können. Wenn wir dies tun, möchten wir, dass der Wert in der Ausgabe in einem verständlichen, eindeutigen Format dargestellt wird. Die Repr- Spezialmethode kann verwendet werden, um dies zu veranlassen. Wenn wir diese Methode definieren, kann sie automatisch aufgerufen werden, wenn wir den Wert einer Instanz einer Klasse drucken, für die wir diese Methode definiert haben. Es sollte jedoch erwähnt werden, dass es auch eine ist str spezielle Methode, für ein ähnliches verwendet, aber nicht identisch Zweck, die Vorrang erhalten können, wenn wir sie auch definiert haben.
Wenn wir die repr- Methode für die Point3D-Klasse nicht definiert und my_point als Instanz von Point3D instanziiert haben, tun wir dies ...
print my_point ... wir können dies als Ausgabe sehen ...
Nicht sehr schön, oder?
Wir definieren also die spezielle Methode repr oder str oder beides, um eine bessere Ausgabe zu erzielen.
**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**
Ausgabe ...
(1, 2, 3) (1, 2, 3)
Implementieren Sie repr für jede Klasse, die Sie implementieren. Es sollte keine Entschuldigung geben. Implementieren Sie str für Klassen, bei denen die Lesbarkeit Ihrer Meinung nach wichtiger ist als die Mehrdeutigkeit.
Siehe diesen Link: https://www.pythoncentral.io/what-is-the-difference-between- str -und- repr -in-python /
>>> variableprint was__repr__()zurückgibt?