Untuk mengubah suai hujah penghias dalam kaedah kelas anak yang diwarisi daripada kelas induk, anda mesti mengatasi kaedah itu sendiri secara eksplisit. Hanya mentakrifkan pembolehubah kelas baharu dengan nama yang sepadan tidak akan mengubah tingkah laku penghias. Hujah penghias terikat pada masa kaedah dihias, bukan apabila kelas dibuat seketika.
Contoh Ilustrasi
Kod Python berikut (test.py
) menunjukkan ini:
<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>
Melaksanakan python test.py
menghasilkan:
<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>
Ini jelas menunjukkan bahawa hanya dengan mentakrifkan semula kaedah (greet
) dalam kelas kanak-kanak anda boleh berjaya mengatasi hujah penghias.
Atas ialah kandungan terperinci Cara Mengatasi Hujah Penghias dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!