You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中sum函数为何与+运算符表现不同?自定义类如何支持sum?

为什么sum函数与+运算符表现不一致

Python内置的sum函数累加时默认初始值为整数0,你示例中的sum([Item(2), Item(4)])实际执行逻辑为:

0 + Item(2) + Item(4)

int类型的__add__方法不支持和Item实例相加,因此触发类型错误。而直接调用Item(2) + Item(4)时,走的是Item类自定义的__add__逻辑,自然可以正常运行,二者底层执行逻辑不一致是表现不同的核心原因。

你提到的itertools.reduce搭配operator.add的方案功能上可行,但写法冗余,更推荐以下两种更简洁的适配方案:


自定义类使用sum函数的两种方案

方案1:显式指定sum的初始值参数

sum支持传入第二个start参数自定义累加初始值,你只需要传入对应类的零值实例即可,不需要修改原有类的实现:

print(sum([Item(2), Item(4)], Item(0)).factor) # 输出6

方案2:为自定义类实现__radd__方法

如果不想每次调用sum都传初始值,可以给Item类新增反向加法魔法方法__radd__。当左操作数(比如sum默认的初始值0)不支持加法操作时,会自动调用右操作数的__radd__方法:

class Item:
    def __init__(self, factor):
        self.factor = factor

    def __add__(self, other):
        return Item(self.factor + other.factor)
    
    # 新增反向加法方法
    def __radd__(self, other):
        # 处理sum初始值0的场景,也可根据需求扩展其他int类型的加法逻辑
        if other == 0:
            return self
        return Item(other) + self

print((Item(2) + Item(4)).factor) # 6
print(sum([Item(2), Item(4)]).factor) # 正常输出6

内容的提问来源于stack exchange,提问作者rosscosack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 10:30:03