상위 클래스에서 상속된 하위 클래스 메서드 내의 데코레이터 인수를 수정하려면 메서드 자체를 명시적으로 재정의해야 합니다. 이름이 일치하는 새 클래스 변수를 정의하는 것만으로는 데코레이터의 동작이 변경되지 않습니다. 데코레이터 인수는 클래스가 인스턴스화될 때가 아니라 메서드가 데코레이트될 때 바인딩됩니다.
예시
다음 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!