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以不同的方式运行。