Python中能否将二元运算符重载为一元运算符使用?
Python是否支持将二元运算符重载为一元运算符使用
首先明确结论:不支持直接将二元运算符(如|)作为一元运算符使用,原因如下:
- Python的运算符元数(即所需操作数的数量)是在语法层面固定的,
|从语法定义上就是二元运算符,Python解析器遇到|foo、foo|这类写法时会直接抛出语法错误,根本不会执行到运算符重载的逻辑层,所以修改__or__、__ror__方法都无法解决这类语法报错。 - 你遇到的
foo | bar触发参数数量错误,是因为二元运算符对应的魔术方法__or__默认需要接收两个参数:self(对应左操作数)和other(对应右操作数),你定义的__or__只接收self一个参数,传入两个操作数调用时自然会报参数不匹配的错误。
关于传入None实现需求的可行性
你可以通过符合二元运算符语法的形式实现类似效果,也就是必须保留左右两个操作数的写法,将其中一个操作数设为None,示例实现如下:
def __or__(self, other): # 当右操作数为None时执行你需要的一元逻辑 if other is None: return self.a + self.b # 其他场景可以保留正常的二元或运算逻辑 return self.a | other.a
调用时需要写成foo | None的形式,就能得到你期望的返回结果,但还是无法使用|foo、foo|这类不符合语法的写法。
替代方案
如果确实需要使用一元运算符实现需求,可以选择Python原生支持的一元运算符进行重载,目前Python支持的一元运算符及对应魔术方法如下:
- 一元正号
+:对应魔术方法__pos__,调用形式为+foo - 一元负号
-:对应魔术方法__neg__,调用形式为-foo - 按位取反
~:对应魔术方法__invert__,调用形式为~foo - 逻辑非
not:对应魔术方法__bool__,调用形式为not foo
比如你可以重载__invert__实现需求:
def __invert__(self): return self.a + self.b
之后直接调用~foo即可得到目标结果。
内容的提问来源于stack exchange,提问作者Undermouse
相关产品推荐
相关产品推荐

