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
相关产品推荐
相关产品推荐

