デコレータとコンテキスト マネージャは 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
関数をパラメータとして受け取り、新しい関数を返しますwrapper
。 wrapper
関数では、元の関数の実行前後に必要な操作を実行できます。
以下は、デコレータを使用して関数の実行時間を計算する例です:
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
ステートメントを使用して呼び出されます。
コンテキスト マネージャーは、クラス デコレーターを使用するか、contextmanager
decorator を使用する 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 ステートメント ブロック内で使用できるようにします。コンテキストマネージャーを参照します。
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 でどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。