2011-12-24 13 views
7

ho la seguente classe in Python__unicode __() non restituisce una stringa

class myTest: 
    def __init__(self, str): 
     self.str = str 

    def __unicode__(self): 
     return self.str 

e in qualche altro file un myTest instantiate per provare il metodo unicode()

import myClass 


c = myClass.myTest("hello world") 

print c 

come Stampare I get <myClass.myTest instance at 0x0235C8A0> tuttavia se ho overrider __ str __() Otterrò hello world come output. La mia domanda è, come dovrei scrivere il overrider per __ unicode __() se voglio che stringa di output invece?

risposta

13

In generale si è fatto in questo modo:

class myTest: 
    def __init__(self, str): 
     self.str = str 

    def __unicode__(self): 
     return self.str 
    def __str__(self):   
     return unicode(self).encode('utf-8') 

Questo perché __unicode__ non è chiamato implicitamente in essi modo che __str__ e __repr__ sono. E è chiamato sotto il cofano dalla funzione built-in unicode, quindi se non si definisce __str__ si avrebbe a che fare:

print unicode(c) 
1

Quando si utilizza print, Python cercherà un metodo __str__ in la tua classe. Se ne trova uno, lo chiamerà. In caso contrario, cercherà un metodo __repr__ e lo chiamerà. Se non riesce a trovarne uno, creerà una rappresentazione interna dell'oggetto,

Poiché la classe non definisce __str____repr__, quindi Python crea la propria rappresentazione di stringa dell'oggetto. Questo è il motivo per cui print c visualizza <myClass.myTest instance at 0x0235C8A0>.

Ora, se si vuole __unicode__ di essere chiamato, è necessario richiedere una versione unicode del vostro oggetto, sia chiamando il unicode built-in:

unicode(c) 

o forzando l'oggetto da rappresentare come unicode:

print u"%s" % c 
Problemi correlati