فصل دوم: دکوراتورها

نوشتن اولین دکوراتور

دکوراتور چیست و چگونه کار می‌کند؟

دکوراتور تابعی است که یک تابع دیگر را به‌عنوان ورودی می‌گیرد، رفتاری به آن اضافه می‌کند و تابعی جدید بازمی‌گرداند، بدون این‌که کد اصلی تابع تغییر کند. این الگو برای اضافه کردن قابلیت‌هایی مانند لاگ‌گیری، اندازه‌گیری زمان اجرا یا کنترل دسترسی بسیار رایج است.

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 است که پیش از اجرای یک ویو، بررسی می‌کند کاربر وارد سیستم شده باشد؛ همان الگویی که در این درس دیدیم، فقط با منطق متفاوت.

برای ذخیره‌ی پیشرفت و شرکت در آزمون، وارد شوید — رایگان است.