ホームページ >バックエンド開発 >Python チュートリアル >Python デコレーターは何から始めますか?

Python デコレーターは何から始めますか?

(*-*)浩
(*-*)浩オリジナル
2019-07-20 13:30:523310ブラウズ

デコレータは Python の重要な部分です。 簡単に言えば、これらは他の関数の機能を変更する関数です。これらはコードを短くし、より Python らしくするのに役立ちます。

Python デコレーターは何から始めますか?

#Python のデコレータを理解したい場合は、まずクロージャの概念を理解する必要があります。 (推奨学習: Python ビデオ チュートリアル )

コンピュータ サイエンスでは、クロージャ (英語: Closure)、字句クロージャ (Lexical Closure) または関数クロージャ (関数クロージャ) とも呼ばれます。は自由変数を参照する関数です。参照された自由変数は、関数が作成された環境を離れた後も関数とともに残ります。

Decorator

通常のデコレータは次のようになります:

import functools

def log(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print('call %s():' % func.__name__)
        print('args = {}'.format(*args))
        return func(*args, **kwargs)

    return wrapper

これは、メソッド名とそのパラメータを出力するデコレーションを定義します。

これを呼び出すには、 は @ で始まる必要があります:

@logdef test(p):
    print(test.__name__ + " param: " + p)
    
test("I'm a param")

出力:

call test():
args = I'm a param
test param: I'm a param

デコレータが使用される場合、@ 構文は次のとおりです。中古ですが、ちょっと面倒です。 実際、デコレータは単なるメソッドであり、次の呼び出しメソッドと何ら変わりはありません:

def test(p):    print(test.__name__ + " param: " + p)

wrapper = log(test)
wrapper("I'm a param")

@構文は関数をデコレータ関数に渡すだけです。それについては魔法のようなものは何もありません。

@functools.wraps(func) に注目してください。これは、Python によって提供されるデコレーターです。元の関数のメタ情報をデコレータ内の func 関数にコピーできます。関数のメタ情報には、docstring、名前、パラメータ リストなどが含まれます。

@functools.wraps(func) を削除してみると、test.__name__ の出力がラッパーになることがわかります。

Python 関連の技術記事の詳細については、Python チュートリアル 列にアクセスして学習してください。

以上がPython デコレーターは何から始めますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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