让我先说我想做的事。我想为变量创建一个惰性包装器,因为我记录了所有方法调用和运算符调用,并在稍后指定要调用它的变量时评估它们。
因此,我希望能够拦截所有方法调用和操作员调用以及特殊方法,以便我可以处理它们。但是,__getattr__
不拦截运算符调用__str__
等,所以我想知道是否有一种通用的方法来重载所有方法调用,或者我应该动态创建一个类并复制所有它的代码(我已经做过,但很丑)。
让我先说我想做的事。我想为变量创建一个惰性包装器,因为我记录了所有方法调用和运算符调用,并在稍后指定要调用它的变量时评估它们。
因此,我希望能够拦截所有方法调用和操作员调用以及特殊方法,以便我可以处理它们。但是,__getattr__
不拦截运算符调用__str__
等,所以我想知道是否有一种通用的方法来重载所有方法调用,或者我应该动态创建一个类并复制所有它的代码(我已经做过,但很丑)。
它可以做到,但是是的,它变得“丑陋”——我曾经写过一个惰性装饰器,它将任何函数变成一个“惰性计算函数”。
基本上,我发现在 Python 中实际使用对象值的唯一时刻是调用特殊的“dunder”方法之一。例如,当您有一个数字时,它的值仅在您在另一个操作中使用它或将其转换为 IO 的字符串时使用(也使用“dunder”方法)
因此,我的包装器将参数注释到函数调用,并返回一个特殊对象,该对象可能具有所有“dunder”方法。仅当调用其中一种方法时,才会调用原始函数 - 然后缓存其返回值以供进一步使用。
实现在这里: https ://bitbucket.org/jsbueno/metapython/src/510a7d125b24/lazy_decorator.py
很抱歉文字和大部分演示文稿都是葡萄牙语。