> 백엔드 개발 > 파이썬 튜토리얼 > Python에서 데코레이터 인수를 재정의하는 방법

Python에서 데코레이터 인수를 재정의하는 방법

Susan Sarandon
풀어 주다: 2025-01-10 08:06:41
원래의
703명이 탐색했습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿