ホームページ  >  記事  >  バックエンド開発  >  デコレータとコンテキスト マネージャは Python でどのように機能しますか?

デコレータとコンテキスト マネージャは Python でどのように機能しますか?

王林
王林オリジナル
2023-10-20 19:04:571320ブラウズ

デコレータとコンテキスト マネージャは Python でどのように機能しますか?

デコレータとコンテキスト マネージャは Python でどのように機能しますか?

Python では、デコレーターとコンテキスト マネージャーは 2 つの非常に便利な概念および関数です。これらはすべて、コードを簡素化し、コードの可読性を高め、コードの再利用を容易にするように設計されています。

1. Decorator
Decorator は、関数の動作を変更するために使用される Python の特別な関数です。これにより、元の関数を変更せずにラップまたは拡張できます。デコレータは、Flask、Django などの多くの Python フレームワークやライブラリで広く使用されており、多くの実際の作業シナリオでも広く使用されています。

デコレータの基本構造は次のとおりです。

def decorator_function(func):
    def wrapper(*args, **kwargs):
        # 在函数执行之前的操作
        result = func(*args, **kwargs)
        # 在函数执行之后的操作
        return result
    return wrapper

デコレータ関数decorator_function関数をパラメータとして受け取り、新しい関数を返しますwrapperwrapper 関数では、元の関数の実行前後に必要な操作を実行できます。

以下は、デコレータを使用して関数の実行時間を計算する例です:

import time

def calculate_time(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"函数 {func.__name__} 的执行时间为 {end_time - start_time} 秒")
        return result
    return wrapper

@calculate_time
def my_function():
    # 执行一些耗时的操作
    time.sleep(2)
    print("函数运行完毕")

my_function()

上の例では、calculate_time デコレータ関数を定義します。 @calculate_time を介して my_function 関数に適用します。 my_function が呼び出されると、デコレータ関数が呼び出され、関数の実行時間が記録されて出力されます。

2. コンテキスト マネージャー
コンテキスト マネージャーは、特定のスコープでコードを実行するツールであり、リソースの使用前後に正しい初期化とクリーンアップ操作を保証できます。コンテキスト マネージャーは通常、with ステートメントを使用して呼び出されます。

コンテキスト マネージャーは、クラス デコレーターを使用するか、contextmanagerdecorator を使用する 2 つの方法で定義できます。

(1) クラス デコレータを使用してコンテキスト マネージャーを実装します:

class MyContextManager:
    def __enter__(self):
        # 初始化资源
        print("进入上下文管理器,初始化资源")
        return self
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        # 清理资源
        print("退出上下文管理器,清理资源")

with MyContextManager() as my_context:
    # 使用资源
    print("使用上下文管理器中的资源")

上の例では、MyContextManager という名前のコンテキスト マネージャー クラスを定義し、__enter__# を実装しました。 ## メソッドと __exit__ メソッド。 __enter__ メソッドではリソースを初期化でき、__exit__ メソッドではリソースをクリーンアップできます。 with ステートメントでは、as キーワードを使用して名前 my_context を指定し、with ステートメント ブロック内で使用できるようにします。コンテキストマネージャーを参照します。

(2)

contextmanager デコレータを使用してコンテキスト マネージャを実装します。

from contextlib import contextmanager

@contextmanager
def my_context_manager():
    # 初始化资源
    print("进入上下文管理器,初始化资源")
    try:
        yield
    finally:
        # 清理资源
        print("退出上下文管理器,清理资源")

with my_context_manager():
    # 使用资源
    print("使用上下文管理器中的资源")

上記の例では、

contextmanager デコレータを使用して定義しますジェネレーター関数 my_context_manager。ジェネレーター関数内で、リソースを初期化してクリーンアップできます。 yield式の前のコード ブロックは __enter__ メソッドに相当し、yield 式の後のコード ブロックは __exit__## に相当します。 # 方法。 with ステートメントでは、as キーワードを使用してコンテキスト マネージャーの名前を指定する必要はありません。 概要:

デコレーターとコンテキスト マネージャーは、Python の非常に便利な概念と機能です。デコレータは関数の動作を変更するために使用でき、多くのフレームワークやライブラリで広く使用されています。コンテキスト マネージャーは、特定のスコープ内でコードを実行し、リソースの適切な初期化とクリーンアップを保証できます。どちらもコードの作成を簡素化し、コードの可読性を向上させ、コードの再利用を容易にすることができます。以上、デコレーターとコンテキストマネージャーについての基本的な紹介とサンプルコードでしたので、ご参考になれば幸いです。

以上がデコレータとコンテキスト マネージャは Python でどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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