Python Decorators
در پایتون، Decorator (دکوراتور) یک تابع است که تابع یا متد دیگری را دریافت کرده، آن را تغییر میدهد یا قابلیتهای جدیدی به آن اضافه میکند، بدون اینکه کد اصلی تابع تغییر کند.
دکوراتورها ابزاری قدرتمند برای افزودن رفتار تکراری (مثل لاگگیری، احراز هویت، کش کردن و …) هستند.
🔹 مفهوم پایه
-
تابع دکوراتور: تابعی است که تابع دیگری را به عنوان ورودی میگیرد و یک تابع جدید برمیگرداند.
-
از علامت
@
برای استفاده راحت از دکوراتور روی یک تابع استفاده میکنیم.
🔹 مثال ساده
📌 خروجی:
🔹 معادل بدون علامت @
همان مثال را میتوان بدون @
هم نوشت:
🔹 دکوراتور با آرگومان
اگر تابع اصلی آرگومان داشته باشد، دکوراتور باید آنها را دریافت و منتقل کند:
📌 خروجی:
🔹 دکوراتور با آرگومان شخصی (Decorator Factory)
گاهی میخواهیم خود دکوراتور ورودی بگیرد:
📌 خروجی:
🔹 استفادههای متداول
-
لاگگیری (Logging): ثبت زمان اجرا و نتایج توابع.
-
احراز هویت (Authentication): بررسی دسترسی کاربر قبل از اجرای تابع.
-
کش کردن (Caching): ذخیره نتایج توابع برای اجرای سریعتر.
-
زمانسنجی (Timing): اندازهگیری مدت اجرای یک تابع.
مثال زمانسنجی:
🔹 دکوراتورهای داخلی پرکاربرد
پایتون دکوراتورهای آماده دارد، مثل:
-
staticmethod@
-
classmethod@
-
property@
مثال:
✅ نکات مهم
-
برای حفظ نام و داکاسترینگ تابع اصلی از
functools.wraps
استفاده کنید: -
دکوراتورها میتوانند روی توابع عادی، متدهای کلاس و حتی دیگر دکوراتورها استفاده شوند.
-
میتوان چندین دکوراتور را با هم روی یک تابع قرار داد:
💡 تمرینهای پیشنهادی
-
دکوراتوری بنویس که هر بار اجرای تابع را لاگ بگیرد (نام تابع و زمان اجرا).
-
دکوراتوری بساز که خروجی تابع را کش کند تا اگر دوباره با همان ورودی صدا زده شد، از نتیجهٔ ذخیرهشده استفاده کند.
-
دکوراتوری بنویس که اگر زمان اجرای تابع بیشتر از 2 ثانیه بود، پیغام هشدار چاپ کند.
دکوراتورها در پایتون یک ویژگی حرفهای و قدرتمند برای جداسازی منطق اصلی کد از منطق جانبی هستند و در فریمورکهایی مثل Flask و Django بهطور گسترده استفاده میشوند.