Python LanguageRappresentazioni di stringhe di istanze di classe: metodi __str__ e __repr__


Osservazioni

Una nota sull'implementazione di entrambi i metodi

Quando entrambi i metodi sono implementati, è piuttosto comune avere un metodo __str__ che restituisca una rappresentazione umana (ad es. "Ace of Spaces") e __repr__ restituisca una rappresentazione di eval -friendly.

In effetti, i documenti Python per repr() annotano esattamente questo:

Per molti tipi, questa funzione fa un tentativo di restituire una stringa che produce un oggetto con lo stesso valore quando viene passato a eval (), altrimenti la rappresentazione è una stringa racchiusa tra parentesi angolari che contiene il nome del tipo dell'oggetto con informazioni aggiuntive spesso incluso il nome e l'indirizzo dell'oggetto.

Ciò significa che __str__ potrebbe essere implementato per restituire qualcosa come "Ace of Spaces" come mostrato in precedenza, __repr__ potrebbe essere implementato per restituire invece Card('Spades', 1)

Questa stringa potrebbe essere passata direttamente indietro in eval in un po 'di "round trip":

object -> string -> object

Un esempio di implementazione di tale metodo potrebbe essere:

def __repr__(self):
    return "Card(%s, %d)" % (self.suit, self.pips)

Gli appunti

[1] Questo output è specifico per l'implementazione. La stringa visualizzata proviene da cpython.

[2] Potresti aver già visto il risultato di questa divisione str() / repr() e non averlo conosciuto. Quando stringhe contenenti caratteri speciali come barre retroverse vengono convertite in stringhe tramite str() le barre retroverse appaiono così come sono (compaiono una volta). Quando vengono convertiti in stringhe tramite repr() (ad esempio, come elementi di una lista visualizzata), i backslash sono sfuggiti e quindi appaiono due volte.

Rappresentazioni di stringhe di istanze di classe: metodi __str__ e __repr__ Esempi correlati