دکوراتور چیست و چگونه کار میکند؟
دکوراتور تابعی است که یک تابع دیگر را بهعنوان ورودی میگیرد، رفتاری به آن اضافه میکند و تابعی جدید بازمیگرداند، بدون اینکه کد اصلی تابع تغییر کند. این الگو برای اضافه کردن قابلیتهایی مانند لاگگیری، اندازهگیری زمان اجرا یا کنترل دسترسی بسیار رایج است.
import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
elapsed = time.time() - start
print(f"{func.__name__} در {elapsed:.4f} ثانیه اجرا شد")
return result
return wrapper
@timer
def slow_square(n):
time.sleep(0.5)
return n * n
print(slow_square(4))نوشتن @timer بالای تعریف تابع، دقیقاً معادل نوشتن slow_square = timer(slow_square) است. استفاده از *args و **kwargs در تابع wrapper باعث میشود دکوراتور برای هر تابعی با هر تعداد آرگومان کار کند.
یکی از کاربردهای بسیار رایج دکوراتور در پروژههای واقعی، دکوراتورهای فریمورک جنگو مانند @login_required است که پیش از اجرای یک ویو، بررسی میکند کاربر وارد سیستم شده باشد؛ همان الگویی که در این درس دیدیم، فقط با منطق متفاوت.