Mari kita melampaui asas untuk memahami penghias secara mendalam. Penghias bukan sahaja mengenai "lapisan tambahan" tetapi menawarkan cara yang canggih untuk menambah fungsi pada fungsi secara dinamik, menjadikannya sangat mudah disesuaikan dan berkuasa.
Pada dasarnya, penghias ialah fungsi tertib tinggi—fungsi yang menerima fungsi lain sebagai hujah, menambah fungsi dan mengembalikan fungsi baharu. Ini membolehkan kami "menghias" fungsi asal dengan keupayaan tambahan, meninggalkan fungsi asal tidak diubah.
Rekap Sintaks:
@decorator_name def my_function(): pass
Menggunakan @decorator_name sebelum my_function ialah singkatan untuk:
my_function = decorator_name(my_function)
Mari bina penghias ringkas yang log apabila fungsi dipanggil.
def log_call(func): def wrapper(*args, **kwargs): print(f"Calling {func.__name__}") return func(*args, **kwargs) return wrapper @log_call def greet(name): print(f"Hello, {name}!") greet("Alice") # Outputs: Calling greet, then Hello, Alice!
Penghias biasanya digunakan untuk:
Kadangkala, penghias memerlukan parameter tambahan. Dalam kes ini, kami menambah fungsi luar untuk menghantar parameter kepada penghias.
Contoh:
def repeat(times): def decorator(func): def wrapper(*args, **kwargs): for _ in range(times): func(*args, **kwargs) return wrapper return decorator @repeat(3) def say_hello(): print("Hello!") say_hello() # Outputs "Hello!" three times
Di sini, ulangi ialah kilang penghias yang menghasilkan penghias berdasarkan hujah times.
Anda boleh menyusun berbilang penghias pada satu fungsi, mewujudkan rangkaian gelagat yang berkuasa.
Contoh:
def make_bold(func): def wrapper(): return "<b>" + func() + "</b>" return wrapper def make_italic(func): def wrapper(): return "<i>" + func() + "</i>" return wrapper @make_bold @make_italic def greet(): return "Hello!" print(greet()) # Outputs: <b><i>Hello!</i></b>
Balut tindanan @make_bold dan @make_italic memberi salam dalam kedua-dua teg tebal dan condong.
Apabila menghias fungsi, anda selalunya mahukan metadata fungsi asal (seperti namanya dan docstring) dikekalkan. Gunakan functools.wraps untuk memastikan pembungkus anda tidak menimpa butiran ini.
from functools import wraps def log_call(func): @wraps(func) def wrapper(*args, **kwargs): print(f"Calling {func.__name__}") return func(*args, **kwargs) return wrapper
@wraps(func) memastikan nama func dan docstring dikekalkan.
Penghias bukan hanya untuk fungsi kendiri; ia juga boleh digunakan dengan kaedah kelas.
Contoh:
@decorator_name def my_function(): pass
Penghias require_auth menyemak sama ada pengguna disahkan sebelum membenarkan akses kepada kaedah access_dashboard.
Penghias ialah bahagian Python yang tidak ternilai, membolehkan anda mempertingkat, mengubah suai dan mengawal tingkah laku fungsi dengan cara yang fleksibel dan boleh digunakan semula. Mereka menjadikan kod anda lebih ekspresif, modular dan elegan. Dengan penghias, anda bukan sahaja menambah fungsi—anda memperhalusi dan memperkayakan pangkalan kod anda.
Atas ialah kandungan terperinci Penghias Python: Lebih Pemahaman tentang Peningkatan Kefungsian. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!