Python中如何为自定义类实现扩展赋值运算符
Python 扩展赋值运算符实现指南
示例代码笔误修正
你给出的运算符列表存在多处输入错误,修正后合法的扩展赋值运算符覆盖以下类别:
- 算术赋值:
+=、-=、*=、/=、%=、**=、//= - 位运算赋值:
&=、|=、^=、<<=、>>=
原示例中的反斜杠除号、孤立的
X=Y、全角破折号的—=、重复的<<=均为输入笔误。
通用实现规则
Python 的扩展赋值(增量赋值)遵循就地修改优先的执行逻辑,所有自定义类实现这类运算符的规则是统一的:
- 执行
X op= Y时,首先检查左操作数X所属的类是否实现了对应运算符的就地魔法方法 - 如果对应魔法方法存在,就直接调用该方法完成对实例的修改,将方法返回值赋值给
X - 如果对应魔法方法不存在,会自动退化为普通二元运算逻辑:先计算
X op Y的结果,再将结果赋值回X
每类扩展赋值运算符对应固定的魔法方法命名规则,即__i + 普通二元运算符的方法后缀,例如:
+=对应__iadd__-=对应__isub__*=对应__imul__/=对应__itruediv__&=对应__iand__- 其他位运算、幂运算、整除、取模类的扩展赋值都遵循这个命名规则。
代码示例:实现+=扩展运算符
以自定义容器类的原地追加功能为例,仅实现+=逻辑即可完整说明实现流程:
class Collection: def __init__(self): self.items = [] # 实现+=对应的就地魔法方法 def __iadd__(self, iterable_obj): # 实现自定义的就地修改逻辑:把传入可迭代对象的所有元素追加到当前集合中 self.items.extend(iterable_obj) # 必须返回修改后的实例,否则最终赋值给X的结果会是None return self # 功能验证 c = Collection() c.items = [1, 2, 3] c += [4, 5, 6] print(c.items) # 输出结果: [1, 2, 3, 4, 5, 6]
注意:实现任何就地魔法方法时都必须返回处理后的有效实例,无返回值会直接破坏赋值逻辑。
退化逻辑说明
如果只实现了普通二元运算对应的魔法方法(比如__add__),没有实现对应的就地魔法方法,执行X += Y时不会修改原实例,而是会生成一个新的运算结果赋值给X,等价于直接写X = X + Y。
内容的提问来源于stack exchange,提问作者JosephAndrew2
相关产品推荐
相关产品推荐

