2011-02-06 11 views
147

In Java, posso eseguire l'override del metodo toString() della mia classe. Quindi la funzione di stampa di Java stampa la rappresentazione della stringa dell'oggetto definito dal suo toString(). Esiste un Python equivalente a Java toString()?Come cambio la rappresentazione della stringa di una classe Python?

Ad esempio, ho una classe PlayCard. Ho un'istanza c di PlayCard. Ora:

>>> print(c) 
<__main__.Card object at 0x01FD5D30> 

Ma quello che voglio è qualcosa di simile:

>>> print(c) 
A♣ 

Come faccio a personalizzare la rappresentazione di stringa delle mie istanze di classe?

sto usando Python 3.x

+0

Che cosa è che SLK? –

+0

slk è un errore di battitura. corretto. – snakile

risposta

197

L'equivalente più vicino a Java di toString è quello di implementare __str__ per la classe. Mettete questo nella definizione di classe:

def __str__(self): 
    return "foo" 

Si consiglia inoltre di implementare __repr__ per aiutare nel debug.

Vedi qui per maggiori informazioni:

+0

Wow, questa è una versione piuttosto vecchia dei documenti;) 's/release \ /2.5.2 \ //' – delnan

+0

L'OP dice che sta usando python 3. L'oggetto di sottoclasse non è richiesto. –

+1

Dude __repr__ resolve –

25

Questo non è così facile come sembra, alcune funzioni di libreria di base non funzionano quando solo str viene sovrascritto (controllato con Python 2.7), vedere questo thread per gli esempi How to make a class JSON serializable Inoltre, prova questo

import json 

class A(unicode): 
    def __str__(self): 
     return 'a' 
    def __unicode__(self): 
     return u'a' 
    def __repr__(self): 
     return 'a' 

a = A() 
json.dumps(a) 

produce

'""' 

e non

'"a"' 

come ci si aspetterebbe.

EDIT: rispondendo commento di mchicago:

unicode non ha attributi - si tratta di una stringa immutabile, il cui valore è nascosto e non disponibile da alto livello di codice Python. Il modulo utilizza re per generare la rappresentazione di stringa che sembra avere accesso a questo attributo interno.Ecco un semplice esempio per giustificare questa:

b = A('b') print b

produce

'a'

mentre

json.dumps({'b': b})

produce

{"b": "b"}

così si vede che la rappresentazione interna viene utilizzata da alcune librerie native, probabilmente per motivi di prestazioni.

Vedi anche questo per maggiori dettagli: http://www.laurentluce.com/posts/python-string-objects-implementation/

+2

Non penso che l'output di 'a' sia previsto. La serializzazione di Json non considera le funzioni ma gli attributi e la classe A non contiene attributi, solo tre funzioni. I dump di JSON considerano l'oggetto come un dizionario e convertiranno tutte le chiavi in ​​strs. – mchicago

Problemi correlati