34

是否有一种简单快捷的方法可以将 sum() 与非整数值一起使用?

所以我可以这样使用它:

class Foo(object):
    def __init__(self,bar)
        self.bar=bar

mylist=[Foo(3),Foo(34),Foo(63),200]
result=sum(mylist) # result should be 300

我尝试了覆盖__add____int__,但我还没有找到解决方案

编辑:

解决方案是实施:

 def __radd__(self, other):
    return other + self.bar

正如威尔在他的帖子中建议的那样。__add__但一如既往,条条大路通罗马,但我认为这是最好的解决方案,因为我的课堂上不需要

4

6 回答 6

37

它有点棘手 - sum() 函数开始并将其添加到下一个等等

您需要实现该__radd__方法:

class T:
    def __init__(self,x):
        self.x = x
    def __radd__(self, other):
        return other + self.x

test = (T(1),T(2),T(3),200)
print sum(test)
于 2009-08-02T11:45:03.353 回答
25

您可能还需要实现该__radd__函数,该函数表示“反向添加”,并在无法在“正向”方向解析参数时调用。例如,尽可能x + y评估x.__add__(y),但如果不存在,那么 Python 会尝试y.__radd__(x).

由于该sum()函数以 integer 开头,0它所做的第一件事就是尝试评估:

0 + Foo(3)

这将要求您实施Foo.__radd__.

于 2009-08-02T11:42:10.177 回答
8

或者,如果您不想导入任何内容,

result = reduce((lambda x,y:x+y), mylist)

__add__另一个小优点是,如果这恰好是您想要进行加法的唯一情况,则不必将方法声明为 Foo 对象的一部分。__add__(但定义未来的灵活性可能不会有什么坏处。)

于 2009-08-02T11:41:55.357 回答
7

尝试:

import operator
result=reduce(operator.add, mylist)

sum() 可能工作得更快,但它只专门用于内置数字。当然,您仍然必须提供一种方法来添加您的 Foo() 对象。如此完整的例子:

class Foo(object):
    def __init__(self, i): self.i = i
    def __add__(self, other):
        if isinstance(other, int):
            return Foo(self.i + other)
        return Foo(self.i + other.i)
    def __radd__(self, other):
        return self.__add__(other)

import operator
mylist = [Foo(42), Foo(36), Foo(12), 177, Foo(11)]
print reduce(operator.add, mylist).i
于 2009-08-02T11:36:24.243 回答
6

尝试使用该__int__方法,然后将列表中的每个元素映射到int函数以获取值:

class Foo(object):
    def __init__(self,bar):
        self.bar = bar
    def __int__(self):
        return self.bar

mylist = [Foo(3),Foo(34),Foo(63),200]
result = sum(map(int,mylist))
print(result)
于 2009-08-02T11:40:48.853 回答
-1

sum()(没有整数破解)解决方案似乎最干净;因为sum()从零开始,所以处理这种情况(来自http://www.marinamele.com/2014/04/modifying-add-method-of-python-class.html):

def __radd__(self, other):
    if other == 0:
        return self
    else:
        return other.__add__(self)
于 2020-05-01T13:20:02.470 回答