Как объединить `Object` со строкой? - PullRequest
7 голосов
/ 16 февраля 2012

Как объединить 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 ]

11 голосов
/ 16 февраля 2012

Просто определите методы __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__()).

4 голосов
/ 16 февраля 2012
_string = Foo('text') + 'string'

Проблема с этой строкой в ​​том, что Python думает, что вы хотите добавить string к объекту типа Foo, а не наоборот.

Это сработало бы, если бы вы написали:

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

EDIT

Вы можете попробовать это с

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

В этом случае ваш Foo объект должен автоматически приводиться к строке.

1 голос
/ 16 февраля 2012

Если это имеет смысл для вашего 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...