How to Override Decorator Arguments in Python

To override the decorator arguments used in a parent class method within a child class, you need to override the method in the child class. Simply declaring new class variables with the same names will not affect the decorator arguments unless you explicitly redefine the method.

Sample Code

Save the following as test.py

def my_decorator_with_args(param1, param2):
    """Decorator that takes 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):
    """ Intending to override the decorator arguments by defining class variables, but since greet() itself is not redefined (overridden), the parent class's decorator is actually used as is. """

    param1 = "DERIVED_PARAM1"
    param2 = "DERIVED_PARAM2"
    # greet() is intentionally not redefined 

class DerivedClassOverride(BaseClass):
    """ This pattern redefines (overrides) the greet() method to change the 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 (without override) ===")
    d = DerivedClass()
    d.greet()

    print("\n=== DerivedClassOverride's greet (with override) ===")
    d_o = DerivedClassOverride()
    d_o.greet()

Enter fullscreen mode Exit fullscreen mode

then run:

python test.py

Enter fullscreen mode Exit fullscreen mode

Result

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

=== DerivedClass's greet (without 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!

Enter fullscreen mode Exit fullscreen mode

原文链接:How to Override Decorator Arguments in Python

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容