2013-03-01 63 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,這是非法的。

相關問題