Rumah >pembangunan bahagian belakang >Tutorial Python >Cara Mengatasi Hujah Penghias dalam Python

Cara Mengatasi Hujah Penghias dalam Python

Susan Sarandon
Susan Sarandonasal
2025-01-10 08:06:41709semak imbas

How to Override Decorator Arguments in Python

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn