Python中如何结合__setitem__实现间接__iadd__索引原地加法
核心原因
obj[key] += value 这类下标原地运算,不会调用宿主类(也就是这里的Foo)的__iadd__方法,它的固定执行流程是:
- 调用
obj.__getitem__(key)取出键对应的值,存为临时变量 - 对这个临时变量执行
+=运算(优先调用临时变量自身的__iadd__,没有对应实现时回退到普通加法逻辑) - 调用
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
相关产品推荐
相关产品推荐

