Python中如何实现首个参数为内置类型的运算符重载?
反向运算符重载解决方案
可以实现首个参数为内置类型的运算符重载,你遇到的报错是因为仅实现了正向加法的__add__方法,未实现Python预留的反向运算符魔术方法。
原理说明
Python执行a + b运算时的调用逻辑如下:
- 优先调用左侧对象
a的__add__(b)方法 - 若左侧对象的
__add__方法返回NotImplemented(内置类型int的__add__无法识别自定义Variable类,就会返回该值),则会自动调用右侧对象b的__radd__(a)方法
你的场景中1 + x触发int的__add__不支持Variable类型,而Variable类没有实现__radd__,因此抛出类型错误。
代码修改示例
只需在Variable类中新增__radd__方法,加法满足交换律,可以直接复用__add__的逻辑:
class Variable: def __init__(self, value): self.value = value def __add__(self, other): if isinstance(other, self.__class__): return self.value + other.value elif isinstance(other, (int, float, complex)): return self.value + other else: raise ValueError('Wrong data type') # 新增反向加法实现 def __radd__(self, other): return self.__add__(other)
效果验证
修改后即可正常执行调换顺序的加法运算:
>>> x = Variable(3) >>> 1 + x 4
拓展说明
所有二元运算符都有对应的反向实现方法,命名规则为__r{运算符方法名}__,例如减法对应__rsub__、乘法对应__rmul__、除法对应__rtruediv__,如果需要支持这些运算符的反向调用,按相同逻辑实现即可。
内容的提问来源于stack exchange,提问作者wong.lok.yin
相关产品推荐
相关产品推荐

