ホームページ >バックエンド開発 >Python チュートリアル >Python でデコレータ引数をオーバーライドする方法

Python でデコレータ引数をオーバーライドする方法

Susan Sarandon
Susan Sarandonオリジナル
2025-01-10 08:06:41711ブラウズ

How to Override Decorator Arguments in Python

親クラスから継承された子クラスのメソッド内のデコレータ引数を変更するには、メソッド自体を明示的にオーバーライドする必要があります。 一致する名前を持つ新しいクラス変数を定義するだけでは、デコレータの動作は変わりません。デコレータ引数は、クラスがインスタンス化されるときではなく、メソッドが装飾されるときにバインドされます。

具体例

次の Python コード (test.py) はこれを示しています。

<code class="language-python">def my_decorator_with_args(param1, param2):
    """Decorator accepting arguments"""
    def actual_decorator(func):
        def wrapper(self, *args, **kwargs):
            print(f"[Decorator] param1={param1}, param2={param2}")
            return func(self, *args, **kwargs)
        return wrapper
    return actual_decorator


class BaseClass:
    @my_decorator_with_args(param1="BASE_PARAM1", param2="BASE_PARAM2")
    def greet(self):
        print("Hello from BaseClass!")


class DerivedClass(BaseClass):
    """
    Attempting to override decorator arguments via class variables;
    however, since `greet()` isn't redefined, the parent's decorator remains active.
    """
    param1 = "DERIVED_PARAM1"
    param2 = "DERIVED_PARAM2"


class DerivedClassOverride(BaseClass):
    """
    Correctly overrides `greet()` to utilize modified decorator arguments.
    """
    @my_decorator_with_args(param1="OVERRIDE_PARAM1", param2="OVERRIDE_PARAM2")
    def greet(self):
        print("Hello from DerivedClassOverride!")


if __name__ == "__main__":
    print("=== BaseClass's greet ===")
    b = BaseClass()
    b.greet()

    print("\n=== DerivedClass's greet (no override) ===")
    d = DerivedClass()
    d.greet()

    print("\n=== DerivedClassOverride's greet (with override) ===")
    d_o = DerivedClassOverride()
    d_o.greet()
</code>

python test.py を実行すると、以下が生成されます:

<code>=== BaseClass's greet ===
[Decorator] param1=BASE_PARAM1, param2=BASE_PARAM2
Hello from BaseClass!

=== DerivedClass's greet (no override) ===
[Decorator] param1=BASE_PARAM1, param2=BASE_PARAM2
Hello from BaseClass!

=== DerivedClassOverride's greet (with override) ===
[Decorator] param1=OVERRIDE_PARAM1, param2=OVERRIDE_PARAM2
Hello from DerivedClassOverride!</code>

これは、子クラスのメソッド (greet) を再定義することによってのみ、デコレーターの引数を正常にオーバーライドできることを明確に示しています。

以上がPython でデコレータ引数をオーバーライドする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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