In Python, repr() è un metodo built-in utilizzato nella programmazione ad oggetti per rappresentare un oggetto come stringa. Anche __str__()
rappresenta il valore di un oggetto, ma è più orientato all'utente finale, mentre __repr__()
è utilizzato principalmente per effettuare operazioni di debug.
Utilizzo di repr() in Python
Per ottenere la rappresentazione del nostro oggetto ci basterà chiamare il metodo repr(obj)
, passandogli come parametro l'oggetto del quale vogliamo la nostra rappresentazione.
import datetime
oggi = datetime.datetime.now()
print(str(oggi))
print(repr(oggi))
""" Output """
2019-12-02 09:19:47.261039
datetime.datetime(2019, 12, 2, 9, 19, 47, 261039)
Come vedi str()
visualizza la data nel formato leggibile dall'utente finale, mentre repr()
visualizza la rappresentazione dell'oggetto datetime
.
Implementare repr() in una classe custom
Nell'esempio precedente, abbiamo visto il risultato che il metodo repr()
ritorna per classe datetime. Tuttavia è possibile implementare un comportamento customizzato di questa funzione per rappresentazione la nostra classe effettuandone l'override:
class Rettangolo:
def __init__(self, base, altezza):
self.base = base
self.altezza = altezza
def __repr__(self):
return "Rettangolo({0}, {1})".format(self.base, self.altezza)
rettangolo = Rettangolo(10, 5)
print(repr(rettangolo))
""" Output """
Rettangolo(10, 5)
Differenze tra __repr__() e __str__()
Un altro esempio molto utilizzato per comprendere l'utilizzo di __repr__()
e la differenza con __str__()
, è quello della rappresentazione dei numeri complessi. Andiamo quindi a creare la classe e a definire i metodi repr e str:
class NumeroComplesso:
def __init__(self, n_reale, n_immaginario):
self.n_reale= n_reale
self.n_immaginario= n_immaginario
def __repr__(self):
return "Razionale({0}, {1})".format(self.n_reale, self.n_immaginario)
def __str__(self):
return "{0} + i{1}".format(self.n_reale, self.n_immaginario)
obj = NumeroComplesso(10, 5)
print(repr(obj))
print(str(obj))
""" Output """
Razionale(10, 5)
10 + i5
Come puoi vedere il metodo repr()
ci da informazioni riguardo l'oggetto creato, mentre str()
ci fornisce un output leggibile dall'utente.
Ricorda inoltre che se il metodo __str__()
non è stato implementato, viene utilizzato __repr__()
al suo posto e se repr() ritorna una stringa, possiamo omettere quindi l'implementazione di str().