ホームページ  >  記事  >  バックエンド開発  >  Pythonデコレータの詳しい解説

Pythonデコレータの詳しい解説

高洛峰
高洛峰オリジナル
2016-10-19 16:06:361205ブラウズ

デコレーターの構文は @ で始まり、その後にデコレーター関数の名前とオプションのパラメーターが続きます。

デコレーター宣言の後には、次のように、装飾された関数と装飾された関数のオプションのパラメーターが続きます:

@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 &#39;deco1&#39;
    return func
def deco2(func):
    print &#39;deco2&#39;
    return func   
@deco1
@deco2
def foo():
    print &#39;foo&#39;
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 &#39;[%s]:%s called&#39; %(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
#------------------

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。