Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 凌驾于连锁经营之上?贪心的_Python_Overriding_Operation - Fatal编程技术网

Python 凌驾于连锁经营之上?贪心的

Python 凌驾于连锁经营之上?贪心的,python,overriding,operation,Python,Overriding,Operation,是否有方法覆盖/实施连锁操作。 我是什么意思?以乘法为例,它处理a*b 在我的例子中,我对二进制或两个操作数使用\uuuuu mul\uuu,然后应用破坏性运算,这意味着3个操作数的结果不同 这是伪代码 class MyClass: def fun(self, lst): for i in lst : x |= i ... destructive ops ... return x def __mul__(self, rhs): return self.fun([self,r

是否有方法覆盖/实施连锁操作。 我是什么意思?以乘法为例,它处理a*b 在我的例子中,我对二进制或两个操作数使用
\uuuuu mul\uuu
,然后应用破坏性运算,这意味着3个操作数的结果不同

这是伪代码

class MyClass:

def fun(self, lst):
   for i in lst : x |= i
   ... destructive ops ...
   return x

def __mul__(self, rhs): return self.fun([self,rhs])
现在这两者是等价的:

 a * b   <==>  fun([a,b])
a*b乐趣([a,b])
但这些都不是:

 a * b * c   <=/=>  fun([a,b,c]) 
a*b*c乐趣([a,b,c])
因为乘法分两步进行,函数调用分一步进行


有没有一种方法可以使乘法变得贪婪,以便在重复时可以收集相同的操作?“+”?

破坏性操作也会使代码很难推理。尝试制定一个纯功能性的解决方案,而不是绕过运算符优先级。

如果您希望示例更清晰,请使用实际的Python代码,而不是伪代码<代码>\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。。它对眼睛更容易,可以与+、/、|、&。。。这就是你在这条路上会遇到困难的目标。最好使用运算符构建语法树,然后使用某些编译器函数应用操作。python只允许每操作重写,而不允许每表达式重写;(不要紧。将结果包装为“UnaryExpression”或“BinaryExpression”类型。您将拥有一个“compile”函数,将其减少为实际值。只需重写Python解释器(覆盖语法语义)您只需要在Python中嵌入您的语言级别。看看SQLAlchemy是如何做到这一点的。它允许您使用表示列的对象和常规Python运算符构建表表达式。此类表达式的结果不能直接使用(它们表示语法树)但它们会传递给其他知道如何解释它们的函数。构建编译器是一个非常常见的编程练习,比您想象的要容易得多。有些语言非常适合此类任务(Scheme、Lisp和Haskell是一些示例),而Python等其他语言则有一些摩擦。