如何用字符串连接`Object`?

时间:2012-02-16 16:03:22

标签: python casting

如何在没有重载和显式类型转换(Object)的情况下将str()与字符串(基元)连接起来?

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

    def __str__(self):
        return self.text


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

输出:

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'

运算符+必须重载? 还有其他方法(只是想知道)吗?

PS:我知道重载运算符和类型转换(如str(Foo('text'))

3 个答案:

答案 0 :(得分:11)

只需定义__add__()__radd__()方法:

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)

将根据您是Foo("b") + "a"(致电__add__())还是"a" + Foo("b")(致电__radd__())来致电他们。

答案 1 :(得分:4)

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

这一行的问题在于Python认为你想要string添加Foo类型的对象,而不是相反。

如果你写的话会有用:

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

修改

您可以尝试

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

在这种情况下,您的Foo对象应自动转换为字符串。

答案 2 :(得分:1)

如果这对您的Foo对象有意义,则可以按如下方式重载__add__方法:

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

示例输出:

textstring