为类定义“__sum__”

Gio*_*ove 8 python oop

是否有类似__sum__方法,类似于__add__,以便将类的实例列表总结为一个新的类实例?

我需要这个,因为在我的情况下sum([a,b,c])应该与sum([sum([a,b]), c]). 换句话说,总和实际上取决于任意数量的参数,并且不能用二元运算来定义__add__

Pro*_*o Q 7

如果您只是定义,则求和将不起作用,__add__因为正如这所解释的,该sum函数以 integer 开头0,并且0 + YourClass将是未定义的。

所以,你也需要定义__radd__。这是一个允许您总结的实现:

def __radd__(self, other):
    if other == 0:
        return self
    else:
        return self.__add__(other)
Run Code Online (Sandbox Code Playgroud)

现在你的班级应该能够总结得很好。

  • 或者只是像“sum(..., start)”那样调用它来提供适当的标识元素。 (4认同)

Wil*_*oho -2

sum是Python中的内置函数。__add__是一种特殊的方法。每个容器对象(例如列表)都有一个__add__方法。您可以在指南中看到它。__add__容器对象和数字对象中的方法的工作方式不同。

l = [1, 2, 3]
b = [4, 5, 6]

# Concatenation using .__add__()
print(l.__add__(b))
Run Code Online (Sandbox Code Playgroud)

结果将是两个列表的串联,

[1, 2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

__add__数值对象中的方法将进行加法运算。

x = 2
y = 3

# addition operation: 2 + 3 = 5
print(x.__add__(y))
Run Code Online (Sandbox Code Playgroud)

您可以使用方法创建自定义列表sum

class Custom(list):
    # adding sum() functionallity
    def sumup(self):
        return sum(self)
Run Code Online (Sandbox Code Playgroud)

像这样创建新的自定义列表对象,

l = Custom([1, 2, 3])
Run Code Online (Sandbox Code Playgroud)

并调用 sumup 方法对自定义列表中的所有值求和

l.sumup()
Run Code Online (Sandbox Code Playgroud)

  • 再次阅读问题。我认为你误解了OP想要的东西 (3认同)
  • “_每当出现 '+' 符号时都会调用 add 方法_”,否:[`__radd__`](https://docs.python.org/3/reference/datamodel.html#object.__radd__) (3认同)