2011-02-08 10 views

risposta

173

Implementare __str__() o __repr__() in metaclasse della classe.

class MC(type): 
    def __repr__(self): 
    return 'Wahaha!' 

class C(object): 
    __metaclass__ = MC 

print C 

Usa __str__ Se si intende una in stringa leggibile, utilizzare __repr__ per le rappresentazioni ambigue.

+2

Vorrei creare un qualche tipo di decoratore di classi, così posso facilmente impostare rappresentazioni di stringhe personalizzate per le mie classi senza dover scrivere un metaclasse per ognuna di esse. Non ho molta familiarità con le metaclassi di Python, quindi puoi darmi qualche suggerimento lì? –

+0

Purtroppo questo non può essere fatto con i decoratori di classe; deve essere impostato quando la classe è definita. –

+9

@ Space_C0wb0y: è possibile aggiungere una stringa come '_representation' al corpo della classe e' return self._representation' nel metodo '__repr __()' del metaclass. –

14
class foo(object): 
    def __str__(self): 
     return "representation" 
    def __unicode__(self): 
     return u"representation" 
+4

Questo non risolve il mio problema. Prova il codice che ho fornito. –

+8

Cambia la rappresentazione della stringa per 'instances' della classe, non per la classe stessa. – tauran

+0

scusa, non vedo la seconda parte del tuo post. Usa il metodo sopra. –

1

Se è necessario scegliere tra __repr__ o __str__ andare per il primo, come per l'implementazione predefinita __str__ chiamate __repr__ quando non è stato definito.

personalizzato Vector3 esempio:

class Vector3(object): 
    def __init__(self, args): 
     self.x = args[0] 
     self.y = args[1] 
     self.z = args[2] 

    def __repr__(self): 
     return "x: {0}, y: {1}, z: {2}".format(self.x, self.y, self.z) 

    def __str__(self): 
     return "Vector3([{0},{1},{2}])".format(self.x, self.y, self.z) 

In questo esempio, repr ritorna ancora una volta una stringa che può essere consumato direttamente/eseguiti, mentre str è più utile come output di debug.

v = Vector3([1,2,3]) 
print repr(v) #Vector3([1,2,3]) 
print str(v)  #Vector(x:1, y:2, z:3) 
+0

Mentre il punto su '__repr__' vs' __str__' è corretto, questo non risponde alla domanda reale, che riguarda oggetti di classe, non istanze. –

+0

Grazie per il feedback, l'ho completamente supervisionato. Permettetemi di rivedere la mia risposta. – user1767754

+0

Penso che le implementazioni per repr e str vengano scambiate. – jspencer

Problemi correlati