gpt4 book ai didi

python - 实现 __add__ 魔法方法让 `sum` 对对象进行操作

转载 作者:行者123 更新时间:2023-12-05 01:44:38 26 4
gpt4 key购买 nike

我正在用 __add__ 方法定义一个类 Foo:

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

def __add__(self, other):
return self.data + other.data

data 属性保存字符串。

最终目标是将 Foo 对象的列表/可迭代对象传递给 sum 方法以连接字符串:

In [580]: s = [Foo('foo'), Foo('bar'), Foo('baz')] 

In [581]: sum(s)

预期:

foobarbaz

实际:

---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-581-4c1cdc765951> in <module>()
----> 1 sum(s)

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

我认为 sum 调用 object.__add__ 将两个方法相加。我知道我可以用另一种方式解决这个问题(可能使用 functools.reduce)但是有什么方法可以使它与 sum 一起工作?

编辑:忘了说了,试过这个:

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

最佳答案

您需要将初始值传递给sum。由于您的类仅支持添加到同一类的其他实例,因此您必须指定一个“空”实例作为初始值:

sum(s, Foo(''))

但是,你的类也有一个问题:它只允许将 Foo 实例添加到其他 Foo 实例,但是添加返回一个字符串,而不是 Foo 实例。所以你不能添加两个以上的 Foos,即使是“手动”:

>>> 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

要解决这个问题,您需要让您的 __add__ 返回一个 Foo:

def __add__(self, other):
return Foo(self.data + other.data)

然后当你执行 sum(s, Foo('')) 时,你将得到的不是字符串 foobarbaz,而是一个 Foo 实例,它的 .data 属性是 'foobarbaz'

关于python - 实现 __add__ 魔法方法让 `sum` 对对象进行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45268881/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com