💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ علیرضا کریمی نژاد
راهنمایی بیشتر درباره Decorator
حسین رمضان پور حل شده توسط حسین رمضان پور

سلام

امیدوارم تا الان همه لحظات خوشی رو سپری کرده باشند

امکانش هست درباره Decorator بیشتر توضیح دهید چون من دقیقا متوجه نشدم و کمی برام گیج کننده بوده است.

ممنون

سلااااااااااااااام

بهتر بود میگفتی مفهومش رو بیشتر توضیح بدم یا پیاده سازیش رو یا هر دوش رو...

بهرحال هر دوش رو توضیح میدم.

a decorator is a function that takes another function and extends the behavior of the latter function without explicitly modifying it.

دکوریتور یه تابع هست که رفتار یه تابع دیگه رو گسترش میده بدون ایجاد تغییر مستقیم تو تابع دیگه.

 

A decorator takes in a function, adds some functionality and returns it.

دکوریتور یه تابع رو میگیره و یه سری چیز بهش اضافه میکنه و برش میگردونه

 

خب تعریف خودم: دکوریتور یه تابع هست که یه تابع دومی رو میگیره میتونه قبل و بعدش یه سری دستورات اجرا بکنه و حتی ورودی‌ها و خروجی‌های تابع دوم رو تغییر بده. فقط بدنه تابع دوم رو نمیتونه تغییر بده.

میتونیم حتی یه سری شرط بذاریم که طبق ورودی‌های تابع دوم تصمیم بگیریم تابع دوم رو اجرا کنیم یا نه؟

یا اینکه ورودی‌های تابع دوم رو چک کنیم یا validate کنیم.

 

یه نمونه ساده از دکوریتور:

def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper
@my_decorator
def say_whee():
    print("Whee!")

خروجی کد بالا:

Something is happening before the function is called.
Whee!
Something is happening after the function is called.

 

اکثر دکوریتور‌ها این شکلین:

def decorator_name(func):
    def wrapper_func(*args, **kwargs):
        # Some statements
        value = func(*args, **kwargs)
        # Some statements
        return value
    return wrapper_func

 

یه نمونه کاربردی از دکوریتور:

import time
def timer(func):
    """Print the runtime of the decorated function"""
    def wrapper_timer(*args, **kwargs):
        start_time = time.perf_counter()    
        value = func(*args, **kwargs)
        end_time = time.perf_counter()      
        run_time = end_time - start_time   
        print(f"Finished {func.__name__!r} in {run_time:.4f} secs")
        return value
    return wrapper_timer
@timer
def waste_some_time(num_times):
    for _ in range(num_times):
        sum([i**2 for i in range(10000)])

خروجی کد بالا:

>>> waste_some_time(1)
Finished 'waste_some_time' in 0.0010 secs
>>> waste_some_time(999)
Finished 'waste_some_time' in 0.3260 sec

 

از دکوریتور توی خیلی از پکیج‌های پایتون استفاده شده. توی سرفصل‌های پیش که با فریمورک های:

Django

Django Rest Freamwork

Flask

استفاده میکنیم. خیلی پیش میاد که از دکوریتورهای از پیش تعریف شده این پکیج‌ها استفاده میکنیم و میبینید که چقدر کاربردی هستش.

 

دکوریتور یه الگوی طراحی (Design Pattern) هم هست. که باز تو سرفصل‌های جلوتر که بهش رسیدم دوباره اونجا یه مقدار در مورد دکوریتور صحبت میکنیم.

 

منابع:

https://realpython.com/primer-on-python-decorators/

https://www.programiz.com/python-programming/decorator

محمدعلی رضا ۲۹ مهر ۱۳۹۹، ۱۲:۲۱

سلام

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

 

با احترام

بهترین پاسخ
حسین رمضان پور ۲۹ مهر ۱۳۹۹، ۱۵:۵۹

اگر بازم کسی توی فهم اولیه دکوریتور مشکل داره 
پیشنهاد میکنم بخش اول این مقاله رو بخونه : لینک

Reza Mobaraki ۱۰ اسفند ۱۳۹۹، ۲۱:۴۵