سید مجتبی شاداب
1 سال پیش توسط سید مجتبی شاداب مطرح شد
1 پاسخ

مبحث دکوراتور

دوست لطفا یکی به طور ساده و قابل فهم توضیح بده که مبحث دکوراتور ها در پایتون چیه؟ در چه بخش هایی کاربرد داره؟


ثبت پرسش جدید
طراح چی
تخصص : برنامه نویسی
@Tarrahchi 1 سال پیش مطرح شد
0

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

در اینجا مثالی از دکوریتور در پایتون را برای توضیح بیشتر بررسی خواهیم کرد:

فرض کنید یک تابع به نام multiply_numbers داریم که دو عدد را به عنوان ورودی دریافت کرده و ضرب آن‌ها را برمی‌گرداند. حال می‌خواهیم بررسی کنیم که آیا این دو عدد مثبت هستند یا خیر. برای این کار، از یک دکوریتور استفاده می‌کنیم:

def check_positive_numbers(func):
    def wrapper(a, b):
        if a <= 0 or b <= 0:
            raise ValueError("The numbers must be positive.")
        return func(a, b)
    return wrapper

@check_positive_numbers
def multiply_numbers(a, b):
    return a * b

result = multiply_numbers(3, 4)
print(result)

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

سپس، با استفاده از دکوریتور @check_positive_numbers، تابع multiply_numbers دوباره تعریف شده است. با این حال، اگر ورودی‌های این تابع نامثبت باشند، خطایی ایجاد خواهد شد.

برای تست این مثال، ورودی‌های تابع multiply_numbers به ترتیب حالتی که در آن از decorator class استفاده می‌کنیم، این است که یک کلاس دیگر را برای استفاده از آن تغییر می‌دهیم. در این حالت، decorator class به عنوان یک wrapper استفاده می‌شود که می‌تواند کلاس دیگری را بپوشاند.

برای مثال، فرض کنید یک کلاسی داریم که یک فرایند زمان‌بر را پیاده‌سازی می‌کند:

class SlowProcess:
    def __init__(self):
        pass

    def process(self):
        time.sleep(3)
        print("Process completed!")

حالتی که در آن از decorator class استفاده می‌کنیم، برای بهبود عملکرد این کلاس است. ما می‌خواهیم تا decorator class خودش را به کلاس SlowProcess متصل کند و زمان پردازش را کم کند:

class FastProcess:
    def __init__(self, process):
        self.process = process

    def process(self):
        print("Starting the process!")
        start_time = time.time()
        self.process.process()
        end_time = time.time()
        print("Process completed!")
        print("Elapsed time: ", end_time - start_time, " seconds")

حال ما می‌توانیم کلاس FastProcess را برای استفاده از کلاس SlowProcess بکار ببریم:

slow_process = SlowProcess()
fast_process = FastProcess(slow_process)
fast_process.process()

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


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام