【问题标题】:How to apply a Python timings decorator to a method within a class如何将 Python 计时装饰器应用于类中的方法
【发布时间】:2011-07-20 15:31:09
【问题描述】:

我正在尝试将here 描述的计时装饰器应用于类中的方法而不是独立方法。这应该怎么做?

我收到此错误:

TypeError:必须使用 SomeClass 实例调用未绑定的方法 wrapper() 第一个参数(取而代之的是浮动实例)

【问题讨论】:

  • 你试过了吗?一样的。函数和方法没有区别。
  • @agf: 不幸的是,有 不同,虽然它不是由函数/方法本身引起的,而是由于类拒绝将非函数转换为实例方法(带有描述符和东西)。但它不应该在这里应用,因为实际的包装器本身就是函数。
  • @delnan 我不确定我是否理解。你是说如果装饰器返回的不是函数,它就不起作用?
  • @agf:是的。参见例如stackoverflow.com/questions/1677747/…

标签: python decorator timing


【解决方案1】:

编辑

感谢您的评论,我想我知道问题所在了。这不起作用:

class A:

    @timings
    @classmethod
    def a(cls, x):
       print(x)

A.a(2)

正是你所说的原因。 TypeError: unbound method wrapper() must be called with A instance as first argument (得到 int instance)

但这确实:

class A:

    @classmethod
    @timings
    def a(cls, x):
        print(x)

A.a(2)

所以顺序很重要。我认为这里发生的事情是它欺骗了python处理绑定方法的方式:当python查看成员a时,它必须做出决定:

  1. 制作绑定方法
  2. 制作类方法
  3. 什么都不做(保持原样)

如果它得到一个正则函数,它将执行 (1),并且@timings 产生一个正则函数。

这能解决问题吗?

【讨论】:

  • 我尝试计时的方法是classmethod。
  • 哦!在那种情况下,我想我知道它可能是什么。我编辑了我的答案:更好吗?
  • 如果我更改顺序,在计时装饰器上方的行中使用 classmethod 装饰器,我得到“TypeError: Class-level classmethod() 只能在 method_descriptor 或实例方法上调用。”
  • @Alex van Houten:在那种情况下,我很难过。我知道你可能不再关心这个问题,但我非常好奇问题是什么,所以如果你发布一些代码,它可能会变得很明显。
  • 我猜你解决了。假设 utility.py 有 Timing 类,那么这个脚本,我称之为 Timing_classmethod.py,工作:“从实用程序导入时间导入 Timing Timings=Timing() 类睡眠:在时间类方法中足够_sleep=1.0 #(at=@) def sleepytime(cls,somestring): time.sleep(cls.enough_sleep) print somestring sleep.sleepytime('done') print timings" 但是,我正在编译 Cython 版本 Timing_classmethod.pyx 并给出了上述错误消息。所以这是 Cython 的问题,我在最新版本中可能会或可能不会解决。
猜你喜欢
  • 2020-11-30
  • 2016-07-24
  • 2016-03-17
  • 2014-03-20
  • 2016-12-31
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
相关资源
最近更新 更多