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

Python中如何结合__setitem__实现间接__iadd__索引原地加法

核心原因

obj[key] += value 这类下标原地运算,不会调用宿主类(也就是这里的Foo)的__iadd__方法,它的固定执行流程是:

  1. 调用obj.__getitem__(key)取出键对应的值,存为临时变量
  2. 对这个临时变量执行+=运算(优先调用临时变量自身的__iadd__,没有对应实现时回退到普通加法逻辑)
  3. 调用obj.__setitem__(key, 运算后的临时变量)把结果写回

你之前的代码只实现了__setitem__,缺失__getitem__实现,第一步取值就会抛出异常,自然无法达到预期效果。

解决方案

只需要补全__getitem__方法,将下标取值的逻辑代理到内部的self.bar属性即可,不需要给Foo实现__iadd__:

class Foo:
    def __init__(self):
        # 注意self.bar需要初始化为支持下标读写的结构,比如字典
        self.bar = {}

    def __setitem__(self, key, value=None):
        self.bar[key] = value

    def __getitem__(self, key):
        return self.bar[key]
效果验证
f = Foo()
f['shmoo'] = 0  # 初始化键值
f['shmoo'] += 5
print(f.bar['shmoo'])  # 输出5,和直接操作f.bar['shmoo'] +=5的效果完全一致

如果需要自定义键不存在时的默认值逻辑,只需要在__getitem__中增加对应的判断即可,比如不存在时默认返回0,就可以省去手动初始化键值的步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:54:25