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

能否在Python类的__add__方法中区分+与+=运算符?

区分Python类中的+与+=运算符

当然可以区分这两个运算符!其实Python早就为它们设计了不同的特殊方法,根本不用在__add__里做判断——+对应__add__方法,+=对应__iadd__(原地加法,in-place add)方法,刚好能完美匹配你想要的两种行为:

完整实现代码

class BigData:
    def __init__(self):
        self.data = []
    
    def __add__(self, other):
        # 处理 + 运算符:返回新的BigData对象
        if not isinstance(other, BigData):
            raise TypeError("只能与BigData类型对象相加")
        new_obj = BigData()
        # 复制当前对象的数据,避免后续修改影响新对象
        new_obj.data = self.data.copy()
        # 追加另一个对象的数据
        new_obj.data.extend(other.data)
        return new_obj
    
    def __iadd__(self, other):
        # 处理 += 运算符:修改当前对象并返回自身
        if not isinstance(other, BigData):
            raise TypeError("只能与BigData类型对象相加")
        self.data.extend(other.data)
        # 必须返回self,否则执行a += b后a会变成None
        return self
    
    # 可选:实现__repr__方便打印查看对象内容
    def __repr__(self):
        return f"BigData(data={self.data})"

方法说明

  • __add__:当你执行a + b时,Python会自动调用a.__add__(b)。这里我们创建一个全新的BigData实例,把两个对象的data合并后赋值给新实例,最后返回它——完全符合你“合并数据返回新对象”的需求,原对象不会被修改。
  • __iadd__:当执行a += b时,Python会调用a.__iadd__(b)。这里直接把b的data追加到当前对象的data里,然后返回self。一定要记得返回self,不然执行a += b后,a会变成None(因为默认方法返回值是None)。

测试示例

# 创建两个实例并初始化数据
a = BigData()
a.data = [1, 2, 3]
b = BigData()
b.data = [4, 5, 6]

# 测试 + 运算符
c = a + b
print(c)  # 输出: BigData(data=[1, 2, 3, 4, 5, 6])
print(a)  # a的data还是[1,2,3],没有被修改

# 测试 += 运算符
a += b
print(a)  # a的data变成了[1, 2, 3, 4, 5, 6]

额外提示

如果你的类是不可变类型(比如Python内置的int、str),通常不需要实现__iadd__,因为不可变对象本身不能被修改,+=最终还是会返回新对象。但对于像BigData这种可变类型(内部包含可变的列表),实现__iadd__可以更高效地原地修改对象,避免不必要的内存拷贝。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:53:13