Python のデコレータに関する一般的な問題と解決策
def decorator(func): def inner_function(): print("Before function") func() print("After function") return inner_function @decorator def hello(): print("Hello, World!") hello()
出力結果は次のとおりです:
Before function Hello, World! After function
このデコレータこの関数は、元の関数の実行の前後に追加情報を出力します。
def decorator_with_args(arg1, arg2): def decorator(func): def inner_function(*args, **kwargs): print(f"Decorator arg1={arg1}, arg2={arg2}") func(*args, **kwargs) return inner_function return decorator @decorator_with_args("Hello", 42) def hello(name): print(f"Hello, {name}!") hello("World")
出力結果は次のとおりです:
Decorator arg1=Hello, arg2=42 Hello, World!
この例では、デコレータ関数 decorator_with_args
は 2 つのパラメータを受け取り、新しいデコレータ関数を返します。新しいデコレータ関数はターゲット関数のパラメータを受け取り、パラメータを出力するときにターゲット関数を呼び出します。
@functools.wraps
デコレータがよく使用されます。元の関数のメタ情報を保持します。これにより、デコレータが関数名やドキュメント文字列などの情報を変更することによって引き起こされるデバッグの困難を回避できます。 import functools def decorator(func): @functools.wraps(func) def inner_function(*args, **kwargs): print("Before function") func(*args, **kwargs) print("After function") return inner_function @decorator def hello(): """This is the Hello function.""" print("Hello, World!") print(hello.__name__) print(hello.__doc__)
出力結果は次のとおりです:
hello This is the Hello function.
この例では、@functools.wraps(func)
は、元の関数と __doc__
属性。
def decorator(cls): class NewClass(cls): def decorated_method(self): print("Decorated method") super().decorated_method() return NewClass @decorator class MyClass: def decorated_method(self): print("Original method") obj = MyClass() obj.decorated_method()
Decorated method Original method
この例では、デコレータ関数は、元のクラスを継承する新しいクラス
NewClass を作成します## MyClass を作成し、元のメソッドに追加の機能を追加します。
概要:
Decorator は Python の非常に強力な関数で、既存の関数やクラスの動作を変更するために使用できます。デコレーターを使用する場合、追加パラメーターを渡す方法、元の関数のメタ情報を保持する方法など、いくつかの問題が発生する可能性があります。上記の例では、いくつかの一般的な問題に対する解決策がコード例とともに詳しく説明されています。デコレータを柔軟に使用することで、コードのスケーラビリティと再利用性を高めることができます。
以上がPython のデコレータに関する一般的な問題と解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。