def __repr__(self):
return '<%s %s (%s:%s) %s>' % (
self.__class__.__name__, self.urlconf_name, self.app_name,
self.namespace, self.regex.pattern)
Qual è il significato / lo scopo di questo metodo?
def __repr__(self):
return '<%s %s (%s:%s) %s>' % (
self.__class__.__name__, self.urlconf_name, self.app_name,
self.namespace, self.regex.pattern)
Qual è il significato / lo scopo di questo metodo?
Risposte:
__repr__dovrebbe restituire una rappresentazione stampabile dell'oggetto, molto probabilmente uno dei modi possibili per creare questo oggetto. Vedi la documentazione ufficiale qui . __repr__è più per gli sviluppatori mentre __str__è per gli utenti finali.
Un semplice esempio:
>>> 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__è l'output che dovrebbe essere leggibile dall'uomo: __repr__dovrebbe essere una rappresentazione leggibile per l'interprete Python (cioè alimentare la stringa all'interprete dovrebbe ricreare l'oggetto). Se un oggetto non ha un __str__metodo, tuttavia, __repr__viene utilizzato al suo posto. Inoltre, come notato: questo esempio in realtà stampa il __str__metodo di self.xe self.y: %rdovrebbe essere usato al posto dell'operazione %sdi formattazione della stringa (poiché la classe non definisce __str__, __repr__viene effettivamente restituita comunque, ma è un'anomalia).
Questo è spiegato abbastanza bene nella documentazione di Python :
repr ( oggetto ): restituisce una stringa contenente una rappresentazione stampabile di un oggetto. Questo è lo stesso valore prodotto dalle conversioni (virgolette inverse). A volte è utile poter accedere a questa operazione come una normale funzione. Per molti tipi, questa funzione tenta di restituire una stringa che restituisce un oggetto con lo stesso valore quando viene passata
eval(), altrimenti la rappresentazione è una stringa racchiusa tra parentesi angolari che contiene il nome del tipo di oggetto insieme a informazioni aggiuntive spesso includendo il nome e l'indirizzo dell'oggetto. Una classe può controllare ciò che questa funzione restituisce per le sue istanze definendo un__repr__()metodo.
Quindi quello che vedi qui è l'implementazione predefinita di __repr__, che è utile per la serializzazione e il debug.
stackoverflowma repr ("stackoverflow") lo è 'stackoverflow'.
__repr__viene utilizzato dall'interprete Python autonomo per visualizzare una classe in formato stampabile. Esempio:
~> 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__>
Nei casi in cui un __str__metodo non è definito nella classe, chiamerà la __repr__funzione nel tentativo di creare una rappresentazione stampabile.
>>> str(demo)
'<StackOverflow demo object __repr__>'
Inoltre, print()ing la classe chiamerà __str__per impostazione predefinita.
Documentazione , per favore
Il metodo __repr__ dice semplicemente a Python come stampare oggetti di una classe
Un esempio per vedere le differenze tra loro (ho copiato da questa fonte ),
>>> x=4
>>> repr(x)
'4'
>>> str(x)
'4'
>>> y='stringy'
>>> repr(y)
"'stringy'"
>>> str(y)
'stringy'
I rendimenti di repr()e str()sono identici per int x, ma c'è una differenza tra i valori di ritorno per str y- uno è formale e l'altro è informale . Una delle differenze più importanti tra le rappresentazioni formali e informali è che l'implementazione predefinita di __repr__per un valore str può essere chiamata come argomento da valutare, e il valore restituito sarebbe un oggetto stringa valido, come questo:
>>> repr(y)
"'a string'"
>>> y2=eval(repr(y))
>>> y==y2
True
Se si tenta di chiamare il valore restituito di __str__come argomento da valutare, il risultato non sarà valido.
Quando creiamo nuovi tipi definendo le classi, possiamo sfruttare alcune funzionalità di Python per rendere le nuove classi convenienti da usare. Una di queste caratteristiche sono i "metodi speciali", detti anche "metodi magici".
I metodi speciali hanno nomi che iniziano e finiscono con due trattini bassi. Li definiamo, ma di solito non li chiamiamo direttamente per nome. Invece, si eseguono automaticamente in circostanze specifiche.
È conveniente poter generare il valore di un'istanza di un oggetto usando un'istruzione print. Quando lo facciamo, vorremmo che il valore fosse rappresentato nell'output in un formato comprensibile e inequivocabile. Il metodo speciale repr può essere utilizzato per far sì che ciò accada. Se definiamo questo metodo, può essere chiamato automaticamente quando stampiamo il valore di un'istanza di una classe per la quale abbiamo definito questo metodo. Va detto, tuttavia, che esiste anche un metodo speciale str , usato per uno scopo simile, ma non identico, che può avere la precedenza, se lo abbiamo anche definito.
Se non abbiamo definito, il repr metodo per la classe Point3D, e hanno my_point istanziato come un esempio di Point3D, e poi lo facciamo ...
stampa my_point ... potremmo vedere questo come output ...
Non molto carino, eh?
Quindi, definiamo il metodo speciale repr o str , o entrambi, per ottenere un output migliore.
**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**
Produzione ...
(1, 2, 3) (1, 2, 3)
Implementa repr per ogni classe implementata. Non ci dovrebbero essere scuse. Implementa str per le classi che ritieni che la leggibilità sia più importante della non ambiguità.
Fare riferimento a questo link: https://www.pythoncentral.io/what-is-the-difference-b Between- str -and- repr -in-python /
>>> variablestampa cosa__repr__()ritorna?