如何装饰陈述

时间:2016-05-13 02:29:31

标签: python

我有一个名为Operators的类,这个类有一个函数池。我想测试每个函数的执行时间。所以代码如下所示。

Class Operators(object):
    def A(self):
       """do something"""
    def B(self):
       """do something"""

Class EvaluateWrap(object):
   def __init__(self):
       self.op = Operator()
   def Evaluate(self):
      def _Decorator(f):
          functool.wrap(f)
          def Wrap(*args, **kwargs):
              # time_start
              f(*args, **kwargs)
              # time end, elapsed
          return Wrap
      return _Decorator

   def Run(self):
      @self.Evaluate()
      op.A()
      @self.Evaluate()
      op.B()

首先,使用self.Evaluate不起作用,除了我发现装饰器只用于类和函数,所以我该怎么办?非常感谢。

1 个答案:

答案 0 :(得分:0)

如果你想在一个(或多个)成员方法中使用类中的装饰器,我不认为这是合理的。因为class是一个整洁的容器。

在一个函数上使用decorator,然后可以用于模块级方法或类方法。

例如,

@timeit decorator允许您通过在方法调用前添加@timeit装饰器来测量专用方法的执行时间。

import time

def timeit(method):

    def timed(*args, **kw):
        ts = time.time()
        result = method(*args, **kw)
        te = time.time()

        print '%r (%r, %r) %2.2f sec' % \
              (method.__name__, args, kw, te-ts)
        return result

    return timed

class Foo(object):

    @timeit
    def foo(self, a=2, b=3):
        time.sleep(0.2)

@timeit
def f1():
    time.sleep(1)
    print 'f1'



f1()
Foo().foo()

output:
f1
'f1' ((), {}) 1.01 sec
'foo' ((<__main__.Foo object at 0x103b849d0>,), {}) 0.20 sec