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