Python中能否将一元运算符(如~)重载为二元运算符?
在Python中能否将一元运算符~重载为二元运算符?
答案是不行,Python的语法规则和运算符重载机制从根本上限制了这种操作:
语法层面的限制
~在Python中是前缀一元运算符,语法解析器只会将它识别为单个操作数的前置运算符。比如表达式a ~ b会被解析为a (~b),也就是先对b执行一元取反操作,再试图将a和取反后的结果进行无运算符的拼接——这本身就是语法错误,连重载的机会都没有。重载方法的限制
对应~的重载方法是__invert__,这个方法的定义只能接收self一个参数(仅作用于单个实例,比如~x调用的是x.__invert__())。你无法给__invert__添加第二个参数来实现二元运算,因为Python在调用这个方法时只会传入一个参数,强行定义多参数会导致调用时抛出参数不匹配的错误。
举个反例,哪怕你强行定义:
class MyClass: def __init__(self, val): self.val = val def __invert__(self, other): return self.val + other.val
当你尝试执行a = MyClass(1); b = MyClass(2); a ~ b时,Python会先尝试解析为a (~b),此时调用b.__invert__(),但这个方法需要两个参数,直接抛出TypeError: __invert__() missing 1 required positional argument: 'other'。
如果想要实现类似a ~ b的中缀二元运算效果,建议使用Python支持的可重载二元运算符,比如@(对应__matmul__方法),或者自定义一个普通方法。
内容的提问来源于stack exchange,提问作者trivicious
相关产品推荐
相关产品推荐

