Rumah > pembangunan bahagian belakang > Tutorial Python > Masalah dan penyelesaian biasa untuk penghias dalam Python

Masalah dan penyelesaian biasa untuk penghias dalam Python

PHPz
Lepaskan: 2023-10-10 11:58:41
asal
1137 orang telah melayarinya

Masalah dan penyelesaian biasa untuk penghias dalam Python

Masalah dan penyelesaian biasa untuk penghias dalam Python

  1. Apakah itu penghias?
    Penghias ialah ciri yang sangat berkuasa dalam Python yang boleh digunakan untuk mengubah suai kelakuan fungsi atau kelas sedia ada tanpa pengubahsuaian kod sumbernya. Penghias sebenarnya adalah fungsi atau kelas yang menerima fungsi atau kelas sebagai parameter dan mengembalikan fungsi atau kelas baharu.
  2. Bagaimana cara menulis penghias mudah?
    Berikut adalah contoh penghias mudah:
def decorator(func):
    def inner_function():
        print("Before function")
        func()
        print("After function")
    return inner_function

@decorator
def hello():
    print("Hello, World!")

hello()
Salin selepas log masuk

Keluarannya ialah:

Before function
Hello, World!
After function
Salin selepas log masuk

Fungsi penghias ini akan mencetak maklumat tambahan sebelum dan selepas fungsi asal dilaksanakan.

  1. Apakah hubungan antara penghias dan penutup?
    Penghias pada asasnya ialah fungsi penutupan. Penutupan merujuk kepada merujuk pembolehubah fungsi luaran dalam fungsi dalaman, supaya fungsi dalaman boleh mengakses pembolehubah fungsi luaran. Dalam penghias, fungsi dalam menerima parameter fungsi luar dan memanggil fungsi luar dalam fungsi dalam.
  2. Bagaimana untuk lulus parameter dalam penghias?
    Kadangkala, kita perlu lulus parameter tambahan dalam penghias. Ini boleh dicapai dengan mentakrifkan fungsi penghias dengan parameter.
def decorator_with_args(arg1, arg2):
    def decorator(func):
        def inner_function(*args, **kwargs):
            print(f"Decorator arg1={arg1}, arg2={arg2}")
            func(*args, **kwargs)
        return inner_function
    return decorator

@decorator_with_args("Hello", 42)
def hello(name):
    print(f"Hello, {name}!")

hello("World")
Salin selepas log masuk

Hasil output ialah:

Decorator arg1=Hello, arg2=42
Hello, World!
Salin selepas log masuk

Dalam contoh ini, fungsi penghias decorator_with_args menerima dua parameter dan kemudian mengembalikan fungsi penghias baharu. Fungsi penghias baharu menerima parameter fungsi sasaran dan memanggil fungsi sasaran semasa mencetak parameter. decorator_with_args接收两个参数,然后返回一个新的装饰器函数。新的装饰器函数接受目标函数的参数,并在打印参数的同时调用目标函数。

  1. 装饰器如何保留原始函数的元信息?
    在装饰器的内部函数中,经常会使用@functools.wraps装饰器来保留原始函数的元信息。这样可以避免因装饰器修改了函数名、文档字符串等信息而导致调试困难。
import functools

def decorator(func):
    @functools.wraps(func)
    def inner_function(*args, **kwargs):
        print("Before function")
        func(*args, **kwargs)
        print("After function")
    return inner_function

@decorator
def hello():
    """This is the Hello function."""
    print("Hello, World!")

print(hello.__name__)
print(hello.__doc__)
Salin selepas log masuk

输出结果为:

hello
This is the Hello function.
Salin selepas log masuk

这个例子中,@functools.wraps(func)保留了原始函数的__name____doc__属性。

  1. 装饰器如何在类中使用?
    装饰器不仅可以应用于函数,还可以应用于类。在类的装饰器中,装饰器函数接收一个类作为参数,并返回一个新的类。
def decorator(cls):
    class NewClass(cls):
        def decorated_method(self):
            print("Decorated method")
            super().decorated_method()

    return NewClass

@decorator
class MyClass:
    def decorated_method(self):
        print("Original method")

obj = MyClass()
obj.decorated_method()
Salin selepas log masuk

输出结果为:

Decorated method
Original method
Salin selepas log masuk

这个例子中,装饰器函数创建了一个新的类NewClass,该类继承自原始类MyClass

    Bagaimanakah penghias mengekalkan maklumat meta bagi fungsi asal?

    Dalam fungsi dalaman penghias, penghias @functools.wraps sering digunakan untuk mengekalkan meta-maklumat fungsi asal Meta information. Ini boleh mengelakkan kesukaran penyahpepijatan yang disebabkan oleh penghias mengubah suai maklumat seperti nama fungsi dan rentetan dokumentasi.

    rrreee🎜Hasil output ialah: 🎜rrreee🎜Dalam contoh ini, @functools.wraps(func) mengekalkan __name__ dan __doc__ daripada fungsi asal >Properties. 🎜
      🎜Bagaimana cara menggunakan penghias dalam kelas?🎜Penghias boleh digunakan bukan sahaja untuk majlis, tetapi juga untuk kelas. Dalam penghias kelas, fungsi penghias menerima kelas sebagai parameter dan mengembalikan kelas baharu. 🎜🎜rrreee🎜Hasil keluarannya ialah: 🎜rrreee🎜Dalam contoh ini, fungsi penghias mencipta kelas NewClass baharu, yang mewarisi daripada kelas asal MyClass dan fungsi Tambahan telah ditambah kepada kaedah asal. 🎜🎜Ringkasan: 🎜Decorator ialah fungsi yang sangat berkuasa dalam Python, yang boleh digunakan untuk mengubah suai gelagat fungsi atau kelas sedia ada. Apabila menggunakan penghias, anda mungkin menghadapi beberapa masalah, seperti cara menghantar parameter tambahan, cara mengekalkan maklumat meta bagi fungsi asal, dsb. Contoh di atas menyediakan penyelesaian kepada beberapa masalah biasa, diperincikan dengan contoh kod. Dengan menggunakan penghias secara fleksibel, kami boleh menambahkan lagi kebolehskalaan dan kebolehgunaan semula pada kod kami. 🎜

Atas ialah kandungan terperinci Masalah dan penyelesaian biasa untuk penghias dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan