Python自定义类如何支持无前缀操作数的+/-一元运算符?
结论
你对+x的调用逻辑认知存在错误,__add__/__radd__是处理二元加法运算(即a + b格式,存在左右两个操作数)的魔法方法,前缀无操作数的+/-属于一元运算符,对应独立的魔法方法,不会被转译为x + 0/x - 0的二元运算逻辑。
对应魔法方法说明
一元正负运算符对应两个专属魔法方法:
__pos__:响应+x操作,通常返回与原对象值一致的新实例__neg__:响应-x操作,返回值取反后的新实例
修正代码示例
你只需要在Interval类中补充实现上述两个方法即可:
class Interval: def __init__(self, mini, maxi): self.mini = mini self.maxi = maxi # 原有__add__、__radd__方法保留,此处省略 # 注意:你原有__add__中的判断 `other == 0 or None` 存在逻辑错误,等价于 `other ==0 or False`,永远无法命中None的情况,需改为 `other == 0 or other is None` # 实现一元+运算符 def __pos__(self): return Interval(self.mini, self.maxi) # 实现一元-运算符,注意区间取反后上下限顺序会翻转 def __neg__(self): return Interval(-self.maxi, -self.mini) # 补充打印方法方便输出查看 def __repr__(self): return f"Interval({self.mini}, {self.maxi})" if __name__ == '__main__': x = Interval(2.5,3.0) print(+x) # 输出:Interval(2.5, 3.0) print(-x) # 输出:Interval(-3.0, -2.5)
内容的提问来源于stack exchange,提问作者newbiecoder11
相关产品推荐
相关产品推荐

