2012-02-16 17 views
6

Cómo concatenar Object con una cadena (primitiva) sin sobrecargar y tipo explícito de conversión (str())?Cómo concatenar `Objeto` con una cadena?

class Foo: 
    def __init__(self, text): 
     self.text = text 

    def __str__(self): 
     return self.text 


_string = Foo('text') + 'string' 

Salida:

Traceback (most recent call last): 
    File "test.py", line 10, in <module> 
     _string = Foo('text') + 'string' 

TypeError: unsupported operand type(s) for +: 'type' and 'str' 

operador + debe sobrecargarse? ¿Hay otras formas (solo preguntarse)?

PS: Yo sé de la sobrecarga de los operadores y la conversión de tipos (como str(Foo('text')))

+0

¿Cuál es su resultado esperado en _string? "textstring"? – Rod

+0

Quiero devolver una cadena. ¡sólo me preguntaba! – tomas

+3

¿Por qué no quieres usar 'str' para forzar el objeto en una cadena? – Marcin

Respuesta

10

Así definen los __add__() y __radd__() métodos:

class Foo: 
    def __init__(self, text): 
     self.text = text 
    def __str__(self): 
     return self.text 
    def __add__(self, other): 
     return str(self) + other 
    def __radd__(self, other): 
     return other + str(self) 

Se llamarán según si lo hace Foo("b") + "a" (llamadas __add__()) o "a" + Foo("b") (llamadas __radd__()).

+1

IMO esto no es una buena práctica. Llamar 'str' explícitamente es el patrón correcto. De todos modos, todavía estás llamando 'str' aquí, solo lo estás ocultando. – Daenyth

+0

@Daenyth, creo que depende de las circunstancias. Esto no es apropiado para ningún objeto viejo; pero para algo destinado a emular una cuerda, es perfectamente razonable. – senderle

+0

@Daenyth: Estoy de acuerdo contigo, pero puede haber excepciones. –

4
_string = Foo('text') + 'string' 

El problema con esta línea es que Python piensa que desea añadir un string a un objeto de tipo Foo, no a la inversa camino alrededor.

Funcionaría aunque si iba a escribir:

_string = "%s%s" % (Foo('text'), 'string') 

EDITAR

Usted podría intentar con

_string = 'string' + Foo('text') 

En este caso el objeto Foo debe ser fundido de forma automática a una cadena.

+1

¿Estás seguro de tu edición? Estoy bastante seguro de que Python no lanzará a la cadena automáticamente. –

+0

@Constantinius, Gracias por el error, pero sé acerca de "tipo de fundición". Quiero entender cómo devolver la cadena real de '__str__' – tomas

+1

No existe tal cosa como Python para lanzar objetos a cadenas. O el método '__add__' lo hará explícitamente o nadie lo hará. – JBernardo

1

Si eso tiene sentido para su objeto Foo, puede sobrecargar el método __add__ de la siguiente manera: salida

class Foo: 
    def __init__(self, text): 
     self.text = text 

    def __str__(self): 
     return self.text 

    def __add__(self, other): 
     return str(self) + other 

_string = Foo('text') + 'string' 
print _string 

Ejemplo:

textstring 
Cuestiones relacionadas