【问题标题】:Python intercept method callPython拦截方法调用
【发布时间】:2012-04-01 13:44:01
【问题描述】:

让我先说我想做的事。我想为一个变量创建一个惰性包装器,就像我记录所有的方法调用和操作符调用,然后在我指定要调用它的变量时评估它们。

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

【问题讨论】:

  • 我给this question写了一个答案,和你想做的类似。
  • 在 dunder 方法上甚至没有调用 __getattribute__。德拉特。

标签: python dynamic methods operator-keyword getattr


【解决方案1】:

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

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

所以,我的包装器将参数注释到函数调用,并返回一个特殊对象, 它可能具有所有“dunder”方法。仅当调用其中一种方法时,才会调用原始函数 - 然后缓存其返回值以供进一步使用。

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

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

【讨论】:

  • 你是对的,__getattribute__ 没有在 dunder 方法上调用。
猜你喜欢
  • 2011-02-11
  • 2014-10-11
  • 2021-09-16
  • 2015-08-14
  • 2020-06-05
  • 1970-01-01
相关资源
最近更新 更多