Python如何实现类实例直接返回默认属性参与运算?
实现方案
要让自定义类实例可以直接参与加法运算、无需显式访问value属性,只需要在类中重载Python对应的运算符特殊方法即可。
你给出的5 + ex场景中,整数5是加法的左操作数,实例ex是右操作数,Python执行运算时会先尝试调用左操作数的__add__方法,整数类型自然没有定义和Example实例相加的逻辑,此时会回退调用右操作数(也就是你的实例)的__radd__(反向加法)方法,我们只要在这个方法里返回value属性和左操作数的计算结果即可。如果还要支持ex + 5这类正向加法场景,再补充实现__add__方法就行。
修改后的可运行代码:
class Example: def __init__(self, value, foo): self.value = value self.foo = foo self.bar = self.modify_stuff(value, foo) def modify_stuff(self, value, foo): """ some code """ pass def __add__(self, other): # 处理 ex + 其他值 的场景 return self.value + other def __radd__(self, other): # 处理 其他值 + ex 的场景 return other + self.value
测试效果:
ex = Example(3, 'foo') ans = 5 + ex print(ans) # 输出8,和5 + ex.value的运算结果完全一致 print(ex + 2) # 输出5,正向加法也可正常运行
如果后续需要支持减法、乘法、除法等其他数值运算,按照相同逻辑实现__sub__/__rsub__、__mul__/__rmul__、__truediv__/__rtruediv__等对应特殊方法即可。
额外提示:如果你希望实例在整数强转、数值索引等所有需要整数的场景都自动被识别为
self.value,可以额外添加__int__方法:def __int__(self): return self.value但要注意,仅实现
__int__方法无法直接支持加法运算符重载,必须单独实现对应运算的特殊方法。
内容的提问来源于stack exchange,提问作者fjsh
相关产品推荐
相关产品推荐

