1

我有下一个代码

def timer_dec(f):
    def wrapper(*args, **kwargs):
        t = time.time()
        args[0].debug('<{}> start'.format(f.__name__))
        res = f(*args, **kwargs)
        args[0].debug('<{}> finish'.format(f.__name__))
        args[0].debug("Working time for function <%s>: %f" % (f.__name__, time.time() - t))
        return  res

    return wrapper

这很好用:

@timer_dec
class A(object):
  pass

但这不起作用:

@timer_dec
class A(object):
  pass

class B(A):
  pass

TypeError:调用元类基础函数()参数1时出错必须是代码,而不是str

Python版本是2.7

4

2 回答 2

4

您似乎将函数装饰器用作类装饰器。

@timer_dec
class A(object):
  pass

相当于

class A(object):
  pass
A = timer_dec(A)

因为timer_dec返回一个函数,A现在是一个函数。


您可以创建一个类装饰器,将函数装饰器应用于类的所有方法。请参阅此处以获取示例:Alex Martelli 对将 python 装饰器应用于类中的方法的回答

于 2013-03-01T10:32:40.307 回答
0

您的装饰器正在返回一个函数。因此,在装饰器调用之后,名称“A”被绑定到一个函数,而不是一个类。然后,您尝试从函数 A 继承 B,这是非法的。

于 2013-03-01T10:31:37.760 回答