Python:定义我自己的操作符?

我想定义我自己的运营商。 python支持这样的事情吗?

不,你不能创build新的运营商。 但是,如果只是计算expression式,则可以自己处理string并计算新运算符的结果。

虽然技术上你不能在Python中定义新的操作符,但这个巧妙的技巧可以解决这个限制。 它允许你定义像这样的中缀运算符:

 # simple multiplication x=Infix(lambda x,y: x*y) print 2 |x| 4 # => 8 # class checking isa=Infix(lambda x,y: x.__class__==y.__class__) print [1,2,3] |isa| [] print [1,2,3] <<isa>> [] # => True 

不,Python自带了一组预定义的但可覆盖的操作符 。

如果您打算将操作应用于特定的对象类,则可以重写与最接近的函数匹配的操作符…例如,覆盖__eq__()将覆盖==操作符以返回您想要的任何内容。 这几乎适用于所有的运营商。

Sage提供了这个function,基本上使用@Ayman Hourieh描述的“巧妙的黑客”,但作为一个装饰器被整合到一个模块中,以提供更清晰的外观和附加function – 您可以select操作员重载,从而评估顺序。

 from sage.misc.decorators import infix_operator @infix_operator('multiply') def dot(a,b): return a.dot_product(b) u=vector([1,2,3]) v=vector([5,4,3]) print(u *dot* v) # => 22 @infix_operator('or') def plus(x,y): return x*y print(2 |plus| 4) # => 6 

有关更多信息,请参阅Sage文档和此增强function跟踪标签 。

Python 3.5引入了符号@作为额外的运算符。

PEP465引入了这个新的算子进行matrix乘法,简化了许多数字编码的符号。 这个运算符不会被所有types实现,而只能用于类似于数组的对象。

你可以通过实现__matmul__()来支持你的类/对象的运算符。

PEP为非数组对象留下了空间,用于操作符的不同用法。

当然你也可以用任何不同于matrix乘法的操作来实现类似于数组的对象,但是用户体验会受到影响,因为每个人都希望你的数据types以不同的方式运行。