如何用Python魔术方法实现自定义对象列表的求和操作?
用Python魔术方法实现自定义类实例的sum求和
要让sum()直接对A类实例的列表求和,你可以利用Python的右侧加法魔术方法__radd__,它专门处理左侧操作数不支持与当前类实例相加的场景(比如sum初始值0和A实例相加的情况)。
实现代码
class A: def __init__(self, x): self.x = x def __radd__(self, other): # 处理左侧为数值、右侧为A实例的加法 return other + self.x a_list = [A(1), A(3)] sum_x = sum(a_list) print(sum_x) # 输出:4
原理说明
sum()函数的执行逻辑是从初始值(默认0)开始,依次将累加值与列表中的每个元素相加:
- 第一步:
0 + A(1)。由于整数0的__add__方法无法处理A实例,Python会调用A(1)的__radd__方法,返回0 + 1 = 1。 - 第二步:
1 + A(3)。同样,整数1无法直接加A实例,调用A(3)的__radd__方法,返回1 + 3 = 4。 - 最终得到所有实例
x属性的总和。
扩展:支持实例间直接相加(可选)
如果还需要让A实例之间能直接相加(比如A(1) + A(3)),可以再实现__add__方法:
class A: def __init__(self, x): self.x = x def __add__(self, other): if isinstance(other, A): return self.x + other.x raise TypeError("只能与A类实例相加") def __radd__(self, other): if other == 0: return self.x return self.__add__(other)
这样既支持sum(a_list),也支持A(1) + A(3)得到4。
内容的提问来源于stack exchange,提问作者Seliverstov
相关产品推荐
相关产品推荐

