Python デコレータの順序

Abid Ullah 2023年10月10日
  1. Python デコレータの順序
  2. Python でのデコレータの順序の前提条件
  3. Python での @decorator の構文
  4. Python でデコレータの順序を決定する方法
  5. デコレータ @decorator Python での順序
  6. Python の 2 種類のデコレータ
Python デコレータの順序

この Python の記事では、デコレーターとは何か、それらがどのように使用され、コードを構築するためにそれらをどのように利用できるかを見ていきます。 デコレーターが、アプリケーションに機能を追加するために使用できる強力なツールであり、Python プログラミング言語で使用できることを確認します。

Python デコレータの順序

Python では、デコレータは別の関数の動作を変更する特別な関数です。 デコレーターは、既存のオブジェクトの構造を変更せずに新しい機能を追加するデザイン パターンであり、通常、関数またはクラスを定義する前に呼び出されます。

Python のデコレーターは、関数とクラスを変更するための強力なツールです。 デコレーターは、別の関数を引数として取り、元の関数をラップする新しい関数を返す関数です。

関数自体のコードを変更せずに、関数の動作を変更するためにも使用できます。 これは、既存の関数に機能を追加したり、特定のコンテキストで関数の動作を変更したりするのに役立ちます。

デコレータは、次のような機能を実装するためによく使用されます。

  1. キャッシング
  2. ロギング
  3. アクセス制御

Python でのデコレータの順序の前提条件

デコレータについて学ぶ前に、Python の基本的な理解が必要です。

Python ではすべてがオブジェクト、クラスでさえも考慮されるという考えに同意する必要があります。 私たちがこれらのものに提供する名前は、それらに関連付けられた識別子にすぎません。

ここに例外はありません。 関数もオブジェクト (属性付き) と見なされます。 複数の異なる名前が、1つの関数オブジェクトに関連付けられる可能性があります。

したがって、次の基本的な知識が必要です。

  1. Python プログラミング言語
  2. 機能
  3. クラス

次に、Python でデコレータの順序を簡単に操作できます。

Python での @decorator の構文

次のステップは、Python のデコレータの構文を調べて調べることです: Python はデコレータを解釈する順序をどのように決定するのでしょうか?

コード例:

@mydecorator
def my_function():
    pass

これが Python の decorator の構文です。 同じ構文の関数とクラスでデコレータを使用します。

Python でデコレータの順序を決定する方法

関数またはクラスに多数のデコレータが適用される場合、デコレータは作成された順序で使用されます。 これにより、予期しない動作が発生する可能性があります。 デコレータが適用される順序は、関数またはクラスの動作に影響を与える可能性があるため、この事実に留意する必要があります。

デコレータが適用される順序は、クラスまたは関数の操作に影響を与える可能性があることに注意してください。 複数のデコレータがコンポーネントに配置される場合、デコレータは宣言された順序で配置されます。

デコレータ @decorator Python での順序

Python では、デコレーターは通常、関数を引数として取り、変更された関数を返す関数として実装されます。 たとえば、次のデコレータを考えることができます。

以下の手順に従ってコードを記述します。

  • def キーワードを使用して関数を定義します。
  • def キーワードを使用して、関数内に別の関数を定義します。
  • 任意のステートメントを出力するか、関数に機能を追加します。
  • 両方の関数に return ステートメントを使用します。
  • デコレータを定義します。
  • デコレータの構文で前述した手順に従います。
  • デコレータ用に別の関数を定義します。
  • 関数にいくつかの機能を追加します。 理解を深めるために、以下のコードを参照してください。
  • デコレータ関数を出力し、パラメータ x の値を提供します。

コード例:

def decorator(func):
    def wrapper(x):
        print("Before calling ", func.__name__)
        result = func(x)
        print("After calling ", func.__name__)
        return result

    return wrapper


@decorator
def foo(x):
    return x + 1


print(foo(2))

ここでは、コード全体の出力を確認するために単純に印刷しています。

コードの出力:

Before calling  foo
After calling  foo
3

最初のステートメントが出力されていることがわかります: (Before calling foo)。 コードの 2 番目のステートメント (After calling foo) が 2 番目に出力されます。

decorator の部分は最後に出力されます。これは、デコレータのパラメーター値に値 2 を渡したため、x+1 です。 その結果、3 が得られました。

ここで、デコレータをよりよく理解するために別のコードを調べます。

したがって、関数とデコレーターを定義する手順は既に完了しています。 要件に応じて、同じ手順を繰り返します。

このコードで、ネストされた関数の 2 番目のステートメントよりも前に decorator 部分を実行したいとします。 したがって、次のコードを使用します。

コード例:

def my_decorator(func):
    def wrapper():
        print("Before the function is called.")
        func()
        print("After the function is called.")

    return wrapper


@my_decorator
def say_hello():
    print("Hello, Abid!")


say_hello()

コードの出力:

Before the function is called.
Hello, Abid!
After the function is called.

ここで、関数が呼び出される前であることがわかります。 が最初に印刷されます。 こんにちは、アビド! デコレータ部分は 2 番目に出力され、関数が呼び出された後 が出力されます。 最後に印刷されます。

Python の 2 種類のデコレータ

次に、2つの異なるデコレータ関数を num() メソッドに適用する方法を見ていきます。 内側のデコレータが最初に動作し、短い休憩の後、外側のデコレータが続きます。

コード例:

# code for testing decorator chaining
def decorator1(function):
    def inner():
        a = function()
        return a + a

    return inner


def decorator(function):
    def inner():
        a = function()
        return 4 * a

    return inner


@decorator1
@decorator
def num():
    return 10


print(num())

コードの出力:

80

したがって、上記の例では、内側の decorator が最初に機能し、外側がその後に機能しました。 したがって、コード80の出力が得られます。

デコレータが適用される順序は重要です。 一般に、関数とクラスには、呼び出される順序でデコレーターを適用する必要があります。

ただし、クラスで使用されるデコレータは、デコレータが関数に適用される前に常に適用する必要があります。

著者: Abid Ullah
Abid Ullah avatar Abid Ullah avatar

My name is Abid Ullah, and I am a software engineer. I love writing articles on programming, and my favorite topics are Python, PHP, JavaScript, and Linux. I tend to provide solutions to people in programming problems through my articles. I believe that I can bring a lot to you with my skills, experience, and qualification in technical writing.

LinkedIn

関連記事 - Python Decorator