1 ماه قبل

بدون دیدگاه

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

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

دکوراتور در پایتون ابزاری قدرتمند برای افزودن یا تغییر عملکرد توابع بدون تغییر در کد اصلی است. در این مقاله با مفهوم و کاربردهای دکوراتور آشنا شوید.

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

دکوراتور در پایتون چیست؟

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

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

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

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

برای درک بهتر دکوراتورها، باید با برخی مفاهیم اساسی پایتون آشنا باشید:

توابع مرتبه اول

در پایتون، توابع «مرتبه اول» هستند، به این معنی که می‌توان آن‌ها را به متغیرها اختصاص داد، به توابع دیگر ارسال کرد، یا به عنوان خروجی از توابع بازگرداند.

مثال:

def greet(name):
    # Return a greeting message
    return f"سلام {name}"

welcome = greet
print(welcome("علی"))

تعریف توابع داخل توابع

در پایتون می‌توانید تابعی را داخل تابع دیگر تعریف کنید.

def parent():
    # Parent function
    print("در حال اجرا parent()")

    def child():
        # Nested child function
        print("در حال اجرا child()")

    child()

توابع به عنوان آرگومان

می‌توان توابع را به عنوان آرگومان به توابع دیگر ارسال کرد.

def execute(func):
    # Execute the passed function
    func()

def greet():
    # Print a greeting message
    print("سلام!")

execute(greet)

ایجاد یک Decorator ساده

حالا بیایید یک Decorator ساده ایجاد کنیم که قبل و بعد از اجرای تابع، پیامی چاپ کند.

def decorator(func):
    # Define the decorator function
    def wrapper():
        print("قبل از اجرای تابع")
        func()
        print("بعد از اجرای تابع")
    return wrapper

@decorator
def greet():
    # The function to be decorated
    print("سلام دنیا!")

greet()

خروجی:

قبل از اجرای تابع
سلام دنیا!
بعد از اجرای تابع

استفاده از Decoratorها با آرگومان‌ها

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

def decorator(func):
    # Define the decorator function
    def wrapper(*args, **kwargs):
        print("در حال اجرای تابع با آرگومان‌ها")
        return func(*args, **kwargs)
    return wrapper

@decorator
def add(a, b):
    # Function that adds two numbers
    return a + b

result = add(5, 3)
print(f"نتیجه: {result}")

خروجی:

در حال اجرای تابع با آرگومان‌ها
نتیجه: 8

Decoratorهای تو در تو

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

def decorator1(func):
    # First decorator
    def wrapper():
        print("دکوراتور 1")
        func()
    return wrapper

def decorator2(func):
    # Second decorator
    def wrapper():
        print("دکوراتور 2")
        func()
    return wrapper

@decorator1
@decorator2
def greet():
    # Function to be decorated
    print("سلام!")

greet()

خروجی:

دکوراتور 1
دکوراتور 2
سلام!

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

گاهی اوقات نیاز داریم دکوراتوری ایجاد کنیم که خودش آرگومان دریافت کند.

def repeat(times):
    # Decorator factory that repeats function execution
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(times):
                func(*args, **kwargs)
        return wrapper
    return decorator

@repeat(3)
def greet(name):
    # Function that greets a person
    print(f"سلام {name}!")

greet("علی")

خروجی:

سلام علی!
سلام علی!
سلام علی!

سوالات شما

دکوراتور در پایتون چیست؟

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

آیا باید از دکوراتورها در پایتون استفاده کنید؟

بله، دکوراتورها کد را خواناتر و قابل‌استفاده مجدد می‌کنند و به کاهش کد تکراری کمک می‌کنند، مخصوصاً برای کاربردهایی مثل اعتبارسنجی و لاگ‌گیری.

ژنراتور و دکوراتور در پایتون چیست؟

ژنراتور تابعی است که با yield مقداردهی می‌کند و داده‌ها را به صورت تنبل ایجاد می‌کند. دکوراتور عملکرد تابع را با تغییر یا افزودن رفتار گسترش می‌دهد.

دکوراتور در جنگو چیست؟

دکوراتورها در جنگو برای مدیریت دسترسی و اعتبارسنجی کاربران در ویوها استفاده می‌شوند؛ مثلاً @login_required دسترسی را محدود به کاربران وارد شده می‌کند.

صحبت آخر

Decorator در پایتون ابزاری قدرتمند برای بهبود و گسترش عملکرد توابع هستند، بدون اینکه نیازی به تغییر در کد اصلی باشد. با استفاده از Decorator، می‌توان کدی تمیزتر، ماژولارتر و قابل نگهداری‌تر نوشت.

همچنین، اگر سؤال یا تجربه‌ای در مورد استفاده از دکوراتورها دارید، خوشحال می‌شویم آن را در بخش نظرات با ما و دیگر کاربران کد اکسپلور به اشتراک بگذارید.

عکس اصلی: Real Python
منبع:

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

پیشنهاد های کد اکسپلور