裝飾器的語法以@開頭,接著是裝飾器函數的名字、可選參數。
緊跟著裝飾器宣告的是被裝飾的函數和被裝飾的函數的可選參數,如下:
@decorator(dec_opt_args)
def func(func_args):
...
def func(func_args): ....說起來,裝飾器其實也就是一個函數,一個用來包裝函數的函數,裝飾器在函數聲明完成的時候被調用,調用之後聲明的函數被換成一個被裝飾器裝飾過後的函數。
如:
def deco(func): ... return func @deco def foo(): print 'foo' #----------------------------------- #等价如下: def deco(func): ... return func def foo(): print 'foo' foo = deco(foo) 如下例子: def deco1(func): print 'ok' return func @deco1 def foo(): print 'foo' foo() #输出-------------- #ok #foo #------------------
如果不使用裝飾器,則可如下:
def deco1(func): print 'ok' return func def foo(): print 'foo' print foo #<function foo at 0x00AFE6F0> foo = deco1(foo) foo() #输出-------------- #ok #foo #------------------
兩者對比下,可發現使用裝飾器是那麼簡便、靈活。特別是在企業級的開發上。
同時也可以多個裝飾器重疊使用:
def deco1(func): print 'deco1' return func def deco2(func): print 'deco2' return func @deco1 @deco2 def foo(): print 'foo' foo() #输出如下:----------- #deco2 #deco1 #foo #---------------------
等效於:
@deco1 @deco2 def foo(arg):pass -----------与下等效---------- foo = deco1(deco2(foo()))
二、有參、無參的裝飾器
上面的例子基本上都是有參數的,無參數更為簡單。
1、無參
@deco1
@deco2
def foo(arg):pass
---------------------
foo = deco1(deco2(foo()))
2、有參
@deco1(deco_arg)
@deco2
def foo(arg)
@deco2
def foo(arg)
---- ----------
foo = deco1(deco_arg)(deco2(foo()))
回傳以函數為參數的裝飾器
三、用處
1、引用日誌
2 、增加計時邏輯來偵測效能
from time import ctime,sleep def deco(func): def decoIn(): print '[%s]:%s called' %(ctime(),func.__name__) return func return decoIn @deco def foo(): pass foo() sleep(4) for i in range(2): sleep(1) foo() #输出如下:-------- #[Fri Jul 05 10:45:04 2013]:foo called #[Fri Jul 05 10:45:09 2013]:foo called #[Fri Jul 05 10:45:10 2013]:foo called #------------------