Skip to main content
 首页 » 编程设计

Python拦截方法调用

2025年05月04日6lonelyxmas

让我先说说我想做什么。我想为一个变量创建一个惰性包装器,因为我记录了所有方法调用和运算符调用,并稍后在我指定要调用它的变量时评估它们。

因此,我希望能够拦截所有方法调用和运算符调用以及特殊方法,以便我可以处理它们。但是, __getattr__ 不会拦截运算符调用或 __str__ 等,所以我想知道是否有一种通用的方法来重载所有方法调用,或者我应该动态地创建一个类并复制所有代码(我已经这样做了,但是很丑)。

请您参考如下方法:

它可以做到,但是,是的,它变得“丑陋”——我曾经写过一个惰性装饰器,它将任何函数变成一个“惰性计算函数”。

基本上,我发现在 Python 中实际使用对象值的唯一时刻是调用特殊的“dunder”方法之一。例如,当你有一个数字时,它的值仅在你在另一个操作中使用它或将它转换为 IO 的字符串时使用(它也使用“dunder”方法)

因此,我的包装器将参数标注为函数调用,并返回一个特殊对象, 它可能具有所有“dunder”方法。就在其中一个方法被调用时,原始函数被调用 - 然后它的返回值被缓存以供进一步使用。

实现在这里: https://bitbucket.org/jsbueno/metapython/src/510a7d125b24/lazy_decorator.py

抱歉,文本和大部分演示文稿都是葡萄牙语。