Masalah dan penyelesaian biasa untuk penghias dalam Python
def decorator(func): def inner_function(): print("Before function") func() print("After function") return inner_function @decorator def hello(): print("Hello, World!") hello()
Keluarannya ialah:
Before function Hello, World! After function
Fungsi penghias ini akan mencetak maklumat tambahan sebelum dan selepas fungsi asal dilaksanakan.
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")
Hasil output ialah:
Decorator arg1=Hello, arg2=42 Hello, World!
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
接收两个参数,然后返回一个新的装饰器函数。新的装饰器函数接受目标函数的参数,并在打印参数的同时调用目标函数。
@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__)
输出结果为:
hello This is the Hello function.
这个例子中,@functools.wraps(func)
保留了原始函数的__name__
和__doc__
属性。
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()
输出结果为:
Decorated method Original method
这个例子中,装饰器函数创建了一个新的类NewClass
,该类继承自原始类MyClass
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.
@functools.wraps(func)
mengekalkan __name__
dan __doc__
daripada fungsi asal >Properties. 🎜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!