ホームページ >バックエンド開発 >Python チュートリアル >例を使用して、Pythonデコレータを理解しています

例を使用して、Pythonデコレータを理解しています

Lisa Kudrow
Lisa Kudrowオリジナル
2025-02-19 09:51:10237ブラウズ

Understanding Python Decorators, with Examples

この記事は、Pythonプログラミングにおけるデコレーターの概念とそれらの最適な使用方法を理解するのに役立ちます。 Pythonデコレーターは何であるか、構文がどのように見えるか、スクリプトやフレームワークでそれらを認識する方法、および自分で適用する方法について説明します。

Pythonの関数デコレータは、構造を変更せずに装飾された関数の関数を拡張し、引数として別の関数を採用する関数にすぎません。デコレーターは別の関数をラップし、その動作を強化し、それを返します。

Pythonのデコレーターのコンセプトは、コードを乾燥させ続けるのに役立ちます(繰り返さないでください)。関数デコレータは、いくつかの重複コードスニペットを組み合わせて関数デコレータを形成できるため、コードベースの不必要な重複を避けます。 Pythonで開発を進めるにつれて、デコレーターは分析とドキュメントを支援できます。また、検証とランタイムチェックを設定するためにも重要です。

以下では、Python機能とプログラミングについての基本的な理解があると思います。少なくともPython 3.8がデバイスにインストールされています。

キーポイント

  • Pythonデコレーターは、構造を変更せずに機能を強化する引数として別の関数をとる関数です。不必要な複製を避けてコードを乾燥させ(繰り返さないでください)、分析、ロギング、検証、およびランタイムチェックに使用できます。
  • Pythonでは、装飾器関数は、関数パラメーターを受信する外部関数と、外部関数内で装飾関数をラップするネストされた関数によって定義されます。デコレーターは、デコレーター機能の前に「@」プレフィックスによって簡単に識別されます。パラメーターは、ラッパー関数に渡し、次に装飾された関数に渡すことができます。
  • デコレータはPythonでチェーンできます。つまり、関数は複数のデコレータで装飾できます。これは、1つのデコレーターを別のデコレーターの上に積み重ねることによって行われます。 Pythonデコレーターの実用的なユースケースには、@ClassMethod、@staticMethod、@Propertyなどの時間ロギング、メモリ、および組み込みのPythonデコレータが含まれます。
Pythonデコレーターを掘り下げる前に Pythonでは、関数は一流の市民であり、パラメーターを受け取るか、パラメーターとして渡すことができることを意味します。デコレーターの概念を完全に把握するには、次のポイントを知る必要があります。 関数はオブジェクトです。つまり、別の変数に割り当てることができます

Pythonでは、すべてがオブジェクトであることを常に覚えておいてください。変数に値を割り当てるのと同じ方法で、必要に応じて機能を変数に割り当てることもできます。これは、デコレーターについて学ぶときに重要です。

関数は、別の関数から
<code class="language-python">def greet():
    print("Hello John")

greet_john = greet
greet_john()
>>>
Hello John</code>
を返すことができます

Pythonの内部関数は、外部関数から返すことができます。これは、遭遇する機能プログラミングの概念の一部です。

関数は、別の関数のパラメーターとして渡すことができます

<code class="language-python">def greet():
    def greeting_at_dawn():
        print("Good morning")

    return greeting_at_dawn

salute = greet()
salute()
>>>
Good morning</code>

関数パラメーターを受信する関数は、高次関数と呼ばれます。

デコレータを実装することを学習し、Pythonプログラムで効果的に使用することを学習するときは、上記のポイントを念頭に置いてください。

Pythonデコレータ操作メカニズム

単純なデコレーター関数は、関数定義、デコレータ関数、および外部ラッパー関数内のネストされた関数から始まります。

デコレータを定義するときは、常に次の2つのポイントを念頭に置いてください。

    デコレーターを実装するには、関数パラメーターを受信する外部関数を定義します。
  1. 外部デコレータ関数にラッパー関数をネストし、デコレータ関数もラップします。
以下は、次のコードスニペットで最も基本的なデコレーター機能がどのように見えるかです。

上記のコードを表示すると、外部関数

(デコレーターとも呼ばれます)は、関数パラメーター
<code class="language-python">def greet():
    print("Hello John")

greet_john = greet
greet_john()
>>>
Hello John</code>
を受信します。

は、装飾されたincrease_number関数を含むラッパー関数です。デコレーターは別の変数に割り当てられます。これは、Pythonデコレータを使用する場合のデコレーター構文が意味するものです。ただし、デコレーターを表現する簡単な方法があります。 func increase_by_one @プレフィックスから始まり、その下の装飾機能を組み合わせたときに、単純なデコレーター関数を認識するのは簡単です。前の例は、次のようにリファクタリングできます get_number

これらの例は、デコレーターがその関数パラメーターの機能を拡張することを示しています。

パラメーターを備えた

<code class="language-python">def greet():
    def greeting_at_dawn():
        print("Good morning")

    return greeting_at_dawn

salute = greet()
salute()
>>>
Good morning</code>
デコレータ関数

場合によっては、パラメーターをデコレーターに渡す必要がある場合があります。この問題の解決策は、引数をラッパー関数に渡してから、装飾された関数に渡すことです。次の例を参照してください: パラメーターを内部またはネストされた関数に渡すことにより、装飾された関数を操作する柔軟性を提供するため、パラメーターがより強力で堅牢になります。任意の数のパラメーター(*args)またはキーワードパラメーター(** kwargs)は、装飾機能に渡すことができます。 *ARGSを使用すると、すべての位置パラメーターのコレクションが許可され、** kWargsは関数呼び出し中に必要なすべてのキーワードパラメーターに使用されます。別の簡単な例を見てみましょう:

上記の例では、 *argsは位置パラメーターをタプルとして使用して反復可能なオブジェクトを形成し、** kWargsはキーワードパラメーター辞書を形成します。

<code class="language-python">def greet_some(func):
    print("Good morning", end=' ')
    func()

def say_name():
    print("John")

greet_some(say_name)
>>>
Good morning John</code>

python

<code class="language-python">def increase_number(func):
    def increase_by_one():
        print("incrementing number by 1 ...")
        number_plus_one = func() + 1
        return number_plus_one
    return increase_by_one

def get_number():
    return 5

get_new_number = increase_number(get_number)
print(get_new_number())
>>>
incrementing number by 1 ...
6</code>
の複数のデコレータまたはチェーンコール

Pythonプロジェクトで関数デコレータを使用する場合、探索するいくつかのオプションがあります。別のユースケースは、デコレーター(2つ以上)を関数にリンクすることです。関数は、複数のデコレータ(複数のデコレータ)で装飾できます。これは、別のデコレータを整理することで実現できます。複数のデコレータが積み重ねられている順序に関係なく、次の例に示すのと同じ出力が得られます。

Pythonデコレータの実用的なユースケース

Pythonでデコレーターを使用する非常に人気のある方法は、時間のロガーとしてです。これにより、プログラマーは機能を実行して効率を測定するのにどれくらいの時間がかかるかを理解するのに役立ちます。

暗記は、Pythonでデコレーターを使用するもう1つのクールな方法です。計算が後で実行されると、関数への繰り返しの呼び出しの結果は、変更なしに簡単に記憶できます。デコレーターを使用して機能を記憶するだけです。

@classmethod、@staticmethod、@propertyなどの内蔵Pythonデコレーターは、PythonのOOPデコレータモードで非常に人気があります。

結論

Pythonデコレーターは、再利用可能なコードとして使用されるため、ソフトウェアエンジニアリングの乾燥原理を実施します。デコレータにリファクタリングできるPython関数の数を考えてください。この記事では、さまざまな形式のデコレーターを探ります。クラスデコレータもありますが、ここではカバーしていません。

デコレーターにより、コードを乾燥させながらソースコードを変更せずに、単純な機能、メソッド、またはクラスに機能を追加することが簡単になります。装飾機能を自分で装飾して、デコレーターのパターンをよりよく理解してみてください。

JavaScriptデコレーターに関する

faqs

JavaScriptデコレーターとは何ですか?

JavaScriptデコレーターは、ECMAScript 2016(ES6)およびその後のバージョンのJavaScriptで導入されたデザインパターンであり、機能です。コメントまたはメタデータを適用することにより、関数、方法、またはクラスの動作を変更または強化できます。デコレーターは、AngularやMobxなどのさまざまなJavaScriptライブラリとフレームワークで一般的に使用されています。 デコレーターは通常、目的関数またはクラスをラップまたは「飾る」関数として実装されます。これらは、コアコードを変更せずに機能を追加したり、ターゲットの動作を変更したりするために使用されます。デコレーターは機能、方法、またはクラスに適用でき、 @シンボルに続いてデコレータの名前が示されます。

なぜJavaScriptデコレータが必要なのですか?

JavaScriptのデコレーターは、次の理由で言語に貴重な追加です。開発者が関数と方法のコアロジックからクロスカットの懸念を分離できるようにすることにより、モジュール性とコードの再利用性を促進します。これにより、混乱を減らし、読みやすさを向上させることにより、クリーンなコードベースが促進され、コードの維持と理解が容易になります。デコレーターは、セキュリティ、ロギング、構成などの側面をコアアプリケーションロジックから分離できるため、懸念の分離の原則を順守する上で重要な役割を果たします。 デコレーターは、特定の動作またはポリシーが関数と方法に一貫して適用されるようにすることにより、コードベースに一貫性をもたらします。これらは、関数の動作を構成およびカスタマイズする柔軟な方法を提供し、コアコードを変更せずに機能の簡単な変更や機能の拡張を可能にします。アスペクト指向のプログラミング(AOP)をサポートすることにより、デコレーターは、クロスカットの懸念に体系的に対処するのに役立ち、よりクリーンで整理されたコードをもたらします。デコレーターはまた、サードパーティライブラリとフレームワークによってますます採用されており、最新のJavaScriptツールを効率的に使用するための必須スキルになっています。全体として、デコレーターはコード組織、読みやすさ、保守性、およびスケーラビリティを改善するため、JavaScript開発者にとって貴重な資産になります。

PythonデコレーターとJavaScriptデコレーターの違いは何ですか?

PythonとJavaScriptデコレーターは、機能またはメソッドの動作を変更するという概念を共有していますが、構文と使用法は異なります。 Pythonは@decorator_function Syntaxを使用し、さまざまな目的で関数とクラスに適用できます。 JavaScriptデコレーターは@Decorator Syntaxを使用し、主にクラス、方法、およびプロパティに使用されます。 Pythonデコレータはより多用途ですが、JavaScriptデコレーターはクラス中心であり、ECMAScript 2016の一部として紹介されました。

出力は、元の画像のフォーマットを維持し、入力テキストの中心的な意味を変更しません。

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

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