Pour modifier les arguments du décorateur au sein d'une méthode de classe enfant héritée d'une classe parent, vous devez explicitement remplacer la méthode elle-même. La simple définition de nouvelles variables de classe avec des noms correspondants ne modifiera pas le comportement du décorateur. Les arguments du décorateur sont liés au moment où la méthode est décorée, pas lorsque la classe est instanciée.
Exemple illustratif
Le code Python suivant (test.py
) le démontre :
<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>
L'exécution de python test.py
produit :
<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>
Cela montre clairement que ce n'est qu'en redéfinissant la méthode (greet
) dans la classe enfant que vous pouvez réussir à remplacer les arguments du décorateur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!