I'm defining a class Foo with an __add__ method:
class Foo():
def __init__(self, data):
self.data = data
def __add__(self, other):
return self.data + other.data
The data attribute is to hold strings only.
Ultimate goal is to pass a list/iterable of Foo objects to a sum method to concatenate strings:
In [580]: s = [Foo('foo'), Foo('bar'), Foo('baz')]
In [581]: sum(s)
Expected:
foobarbaz
Actual:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-581-4c1cdc765951> in <module>()
----> 1 sum(s)
TypeError: unsupported operand type(s) for +: 'int' and 'Foo'
I thought sum calls object.__add__ to sum the two methods together. I know I can solve this another way (possibly with functools.reduce) but is there a way I can get this to work with sum?
Edit: Forgot to mention, tried this:
In [582]: sum(s, Foo(''))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-582-e3eeba9a6d93> in <module>()
----> 1 sum(s, Foo(''))
TypeError: Can't convert 'Foo' object to str implicitly
You need to pass an initial value to sum. Since your class only supports adding to other instances of the same class, you'd have to specify an "empty" instance as the initial value:
sum(s, Foo(''))
However, your class also has a problem: it only allows adding Foo instances to other Foo instances, but the addition returns a string, not a Foo instance. So you can't add more than two Foos, even "manually":
>>> Foo('a') + Foo('b') + Foo('c')
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
Foo('a') + Foo('b') + Foo('c')
TypeError: must be str, not Foo
To fix this, you need to make your __add__ return a Foo:
def __add__(self, other):
return Foo(self.data + other.data)
Then when you do sum(s, Foo('')), what you will get is not the string foobarbaz, but a Foo instance whose .data attribute is 'foobarbaz'.
__add__ must return Foo(self.data + other.data).
As a rule of thumb, the __methods__ should return objects of type type(self), although this is not always true. E.g. what would you expect Int + Int or Float + Float to return?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With