デコレーターの構文は @ で始まり、その後にデコレーター関数の名前とオプションのパラメーターが続きます。
デコレーター宣言の後には、次のように、装飾された関数と装飾された関数のオプションのパラメーターが続きます:
@decorator(dec_opt_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 #------------------
2 つを比較すると、デコレータの使用が非常にシンプルで柔軟であることがわかります。特にエンタープライズレベルの開発においてはそうです。
複数のデコレータを重複して使用することもできます:
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()))
2. パラメータ付きおよびパラメータなしのデコレータ
上記の例には基本的にパラメータがあり、これより単純なパラメータはありません。
1. 高麗人参はありません
@deco1
@deco2
def foo(arg):pass
---------------------
foo = deco1(deco2(foo()))
2、高麗人参があります
@deco1(deco_arg)
@deco2
def foo(arg):pass
---------- ----------
foo = deco1(deco_arg)(deco2(foo()))
関数をパラメータとして取るデコレーターを返します
3. 参照ログ
1を使用します。2、パフォーマンスをテストするためのタイミングロジックを追加します
3. 関数にトランザクションを追加する機能
4. 例
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 #------------------