آشنایی کامل با دکوریتورها در پایتون – تزئین رفتار توابع با کدهای قابل‌استفاده مجدد

دکوریتورها در پایتون ابزار قدرتمندی برای تغییر یا گسترش رفتار توابع و کلاس‌ها بدون تغییر در کد اصلی آن‌ها هستند. با استفاده از دکوریتورها می‌توان منطق‌هایی مانند لاگ‌گیری، احراز هویت، کش‌کردن، یا بررسی زمان اجرا را به‌صورت تمیز و قابل‌تکرار پیاده‌سازی کرد. این مقاله به بررسی ساختار، نحوه تعریف، کاربردهای رایج و مثال‌های عملی دکوریتورها می‌پردازد.

پایتوندکوریتورتابعتزئین-رفتار

~2 دقیقه مطالعه • بروزرسانی ۲۵ شهریور ۱۴۰۴

مقدمه


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


ساختار پایه دکوریتور


یک دکوریتور تابعی است که تابع دیگری را به‌عنوان ورودی دریافت کرده و نسخه‌ای جدید از آن را بازمی‌گرداند:


def my_decorator(func):
    def wrapper():
        print("Before function runs")
        func()
        print("After function runs")
    return wrapper

استفاده از دکوریتور با علامت @


برای اعمال دکوریتور روی یک تابع، از علامت @ استفاده می‌کنیم:


@my_decorator
def say_hello():
    print("Hello!")

say_hello()

خروجی:


Before function runs
Hello!
After function runs

دکوریتور با آرگومان‌های ورودی


برای پشتیبانی از توابعی که آرگومان دارند، باید از *args و **kwargs استفاده کنیم:


def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__} with {args} and {kwargs}")
        return func(*args, **kwargs)
    return wrapper

کاربردهای رایج دکوریتورها



  • لاگ‌گیری: ثبت اطلاعات مربوط به اجرای توابع

  • احراز هویت: بررسی دسترسی کاربران قبل از اجرای تابع

  • کش‌کردن: ذخیره نتایج تابع برای جلوگیری از محاسبه مجدد

  • زمان‌سنجی: اندازه‌گیری زمان اجرای تابع


دکوریتورهای توکار پایتون


پایتون چند دکوریتور توکار دارد که بسیار کاربردی‌اند:



  • @staticmethod برای تعریف متد ایستا

  • @classmethod برای متدهایی که به کلاس دسترسی دارند

  • @property برای تبدیل متد به ویژگی قابل‌دسترسی


دکوریتورهای تو در تو (Nested Decorators)


می‌توان چند دکوریتور را روی یک تابع اعمال کرد:


@auth_check
@log_decorator
def process_data():
    pass

در این حالت، ابتدا log_decorator اجرا می‌شود و سپس auth_check.


جمع‌بندی


دکوریتورها در پایتون ابزاری قدرتمند برای تزئین و کنترل رفتار توابع هستند. با استفاده از آن‌ها می‌توان منطق‌های مشترک را به‌صورت تمیز و قابل‌تکرار پیاده‌سازی کرد. یادگیری دکوریتورها، گامی مهم در مسیر حرفه‌ای شدن در پایتون است.


نوشته و پژوهش شده توسط دکتر شاهین صیامی