2013-03-01 64 views
0

我有一个代码装饰和错误()函数的参数1必须是代码,而不是str的

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: Error when calling the metaclass bases function() argument 1 must be code, not str

Python version is 2.7

+0

你能举一个装饰器的例子吗? – ngelik 2013-03-01 10:38:13

回答

2

您似乎在使用函数装饰器作为类装饰器。

@timer_dec 
class A(object): 
    pass 

相当于

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

由于timer_dec返回一个函数,现在A是一个函数。


您可以创建一个类装饰器,将类装饰器应用于类的所有方法。看到这里的一个例子:Alex Martelli's answer to Applying python decorators to methods in a class

+0

对于Python 3也是如此,它给出了相同的无用错误消息。 – 2017-04-04 09:31:17

0

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

相关问题