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

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

関数は、別の関数から
def greet():
    print("Hello John")

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

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

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

def greet():
    def greeting_at_dawn():
        print("Good morning")

    return greeting_at_dawn

salute = greet()
salute()
>>>
Good morning

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

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

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

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

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

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

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

(デコレーターとも呼ばれます)は、関数パラメーター
def greet():
    print("Hello John")

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

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

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

パラメーターを備えた

def greet():
    def greeting_at_dawn():
        print("Good morning")

    return greeting_at_dawn

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

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

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

def greet_some(func):
    print("Good morning", end=' ')
    func()

def say_name():
    print("John")

greet_some(say_name)
>>>
Good morning John

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
の複数のデコレータまたはチェーンコール

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 までご連絡ください。
Pythonリストは、フードの下に動的な配列またはリンクリストですか?Pythonリストは、フードの下に動的な配列またはリンクリストですか?May 07, 2025 am 12:16 AM

PythonListsareimplementedasdynamicarrays、notlinkedlists.1)they restorediguourmemoryblocks、それはパフォーマンスに影響を与えることに影響を与えます

Pythonリストから要素をどのように削除しますか?Pythonリストから要素をどのように削除しますか?May 07, 2025 am 12:15 AM

pythonoffersfourmainmethodstoremoveelements fromalist:1)removesthefirstoccurrenceofavalue、2)pop(index(index(index)removes regvess returnsaspecifiedindex、3)delstatementremoveselementselementsbyindexorseLice、および4)clear()

スクリプトを実行しようとするときに「許可を拒否された」エラーを取得した場合、何を確認する必要がありますか?スクリプトを実行しようとするときに「許可を拒否された」エラーを取得した場合、何を確認する必要がありますか?May 07, 2025 am 12:12 AM

toresolvea "許可denided" errors whenrunningascript、sofflowthesesteps:1)checkandadaddadaddadadaddaddadadadaddadaddadaddadaddaddaddaddaddadaddadaddaddaddaddadaddaddaddadadaddadaddadaddadadisionsisingmod xmyscript.shtomakeitexexutable.2)

Arrayは、Pythonでの画像処理でどのように使用されていますか?Arrayは、Pythonでの画像処理でどのように使用されていますか?May 07, 2025 am 12:04 AM

ArraySarecrucialinpythonimageprocessing asheyenable efficientmanipulation analysisofimagedata.1)画像anverttonumpyArrays、with grayscaleimagesasas2darraysandcolorimagesas.

リストよりも大幅に高速な配列の操作はどのような種類ですか?リストよりも大幅に高速な配列の操作はどのような種類ですか?May 07, 2025 am 12:01 AM

有意に発生することは、採用中に採用されていることを確認してください

リストと配列間の要素ごとの操作のパフォーマンスの違いを説明します。リストと配列間の要素ごとの操作のパフォーマンスの違いを説明します。May 06, 2025 am 12:15 AM

ArsareSareBetterElement-WiseOperationsduetof of ActassandoptimizedImplementations.1)ArrayshaveContigUousMoryFordiRectAccess.2)ListSareFlexibleButSlowerDueTopotentialDynamicresizizizizing.3)

numpyアレイ全体で数学操作を効率的に実行するにはどうすればよいですか?numpyアレイ全体で数学操作を効率的に実行するにはどうすればよいですか?May 06, 2025 am 12:15 AM

Numpyの配列全体の数学的操作は、ベクトル化された操作を通じて効率的に実装できます。 1)追加(arr 2)などの簡単な演算子を使用して、配列で操作を実行します。 2)Numpyは、基礎となるC言語ライブラリを使用して、コンピューティング速度を向上させます。 3)乗算、分割、指数などの複雑な操作を実行できます。 4)放送操作に注意して、配列の形状が互換性があることを確認します。 5)np.sum()などのnumpy関数を使用すると、パフォーマンスが大幅に向上する可能性があります。

Pythonアレイに要素を挿入するにはどうすればよいですか?Pythonアレイに要素を挿入するにはどうすればよいですか?May 06, 2025 am 12:14 AM

Pythonでは、要素をリストに挿入するための2つの主要な方法があります。1)挿入(インデックス、値)メソッドを使用して、指定されたインデックスに要素を挿入できますが、大きなリストの先頭に挿入することは非効率的です。 2)Append(Value)メソッドを使用して、リストの最後に要素を追加します。これは非常に効率的です。大規模なリストの場合、append()を使用するか、dequeまたはnumpy配列を使用してパフォーマンスを最適化することを検討することをお勧めします。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。