ホームページ >バックエンド開発 >Python チュートリアル >Python デコレーター: 機能強化への理解をさらに深める

Python デコレーター: 機能強化への理解をさらに深める

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-19 22:09:021024ブラウズ

Python Decorators: More Understanding into Functionality Enhancement

基本を超えてデコレータを深く理解しましょう。デコレーターは単なる「追加レイヤー」ではなく、関数に機能を動的に追加する洗練された方法を提供し、関数を高度に適応性と強力なものにします。


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

本質的に、デコレーターは高階関数であり、別の関数を引数として受け取り、機能を追加し、新しい関数を返す関数です。これにより、元の関数を変更せずに、追加機能で元の関数を「装飾」することができます。

構文の要約:

@decorator_name
def my_function():
    pass

my_function の前に @decorator_name を使用すると、以下の短縮形になります:

my_function = decorator_name(my_function)

2.基本的なデコレータを構築する

関数が呼び出されたときにログを記録する単純なデコレーターを構築してみましょう。

def log_call(func):
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__}")
        return func(*args, **kwargs)
    return wrapper

@log_call
def greet(name):
    print(f"Hello, {name}!")

greet("Alice")  # Outputs: Calling greet, then Hello, Alice!
  • log_call は、greet をラップするデコレータです。
  • *args と `kwargs`** は、任意の数の位置引数またはキーワード引数で動作することを保証します。

3.実際の使用例

デコレータは一般的に次の目的で使用されます。

  • アクセス制御: 例: ユーザー権限の確認。
  • キャッシュ: 負荷の高い関数呼び出しの結果を保存します。
  • 再試行メカニズム: 失敗時に関数を自動的に再試行します。
  • 入力検証: 関数の実行前に引数をチェックします。

4.引数を持つデコレータ

デコレータには追加のパラメータが必要な場合があります。このような場合、外部関数を追加してパラメータをデコレータに渡します。

:

def repeat(times):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(times):
                func(*args, **kwargs)
        return wrapper
    return decorator

@repeat(3)
def say_hello():
    print("Hello!")

say_hello()  # Outputs "Hello!" three times

ここで、repeat は、times 引数に基づいてデコレータを生成するデコレータ ファクトリです。


5.スタッキングデコレータ

単一の関数に複数のデコレータをスタックして、強力な動作チェーンを作成できます。

:

def make_bold(func):
    def wrapper():
        return "<b>" + func() + "</b>"
    return wrapper

def make_italic(func):
    def wrapper():
        return "<i>" + func() + "</i>"
    return wrapper

@make_bold
@make_italic
def greet():
    return "Hello!"

print(greet())  # Outputs: <b><i>Hello!</i></b>

@make_bold と @make_italic のラップを重ねると、太字と斜体の両方のタグで挨拶が表示されます。


6. functools.wraps によるメタデータの保存

関数を装飾する場合、多くの場合、元の関数のメタデータ (関数の名前やドキュメント文字列など) を保持したいことがあります。 functools.wraps を使用して、ラッパーがこれらの詳細を上書きしないようにしてください。

from functools import wraps

def log_call(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__}")
        return func(*args, **kwargs)
    return wrapper

@wraps(func) は、func の名前と docstring が確実に保持されるようにします。


7.クラスのデコレーター

デコレータはスタンドアロン関数のためだけのものではありません。クラスメソッドと一緒に使用することもできます。

:

@decorator_name
def my_function():
    pass

require_auth デコレータは、access_dashboard メソッドへのアクセスを許可する前に、ユーザーが認証されているかどうかを確認します。


結論: デコレータでコードを強化する

デコレータは Python の非常に貴重な部分であり、柔軟で再利用可能な方法で関数の動作を強化、変更、制御することができます。これらにより、コードがより表現力豊かになり、モジュール化され、エレガントになります。デコレータを使用すると、機能を追加するだけでなく、コードベースを洗練し、充実させることができます。

以上がPython デコレーター: 機能強化への理解をさらに深めるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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