2011-12-24 20 views
7

tengo la clase siguiente en Python__ __unicode() no devuelve una cadena

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

    def __unicode__(self): 
     return self.str 

y en algún otro archivo una myTest instantiate de probar el método Unicode()

import myClass 


c = myClass.myTest("hello world") 

print c 

como imprimir me sale <myClass.myTest instance at 0x0235C8A0>, sin embargo, si sobreescribo __ str __() Obtendré hello world como salida. Mi pregunta es, ¿cómo debo escribir el overrider para __ unicode __() si quiero que muestre cadena en su lugar?

Respuesta

13

Por lo general, se hace así:

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

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

Esto se debe a que no __unicode__ se llama implícitamente en ellos manera que __str__ y __repr__ son. Se es llamado bajo el capó por la función incorporada unicode, por lo que si no se define __str__ que tendría que hacer:

print unicode(c) 
1

Cuando se utiliza print, Python buscará un método en __str__ Tu clase. Si encuentra uno, lo llamará. Si no lo hace, buscará un método __repr__ y lo llamará. Si no puede encontrar uno, creará una representación interna de su objeto,

Dado que su clase no define __str__ ni __repr__, Python crea su propia cadena de representación del objeto. Esta es la razón por la cual print c muestra <myClass.myTest instance at 0x0235C8A0>.

Ahora, si quieres __unicode__ de ser llamado, es necesario solicitar una versión Unicode de su objeto, ya sea mediante una llamada al unicode built-in:

unicode(c) 

o forzando su objeto a representar como Unicode:

print u"%s" % c 
Cuestiones relacionadas