امیدوارم تا الان همه لحظات خوشی رو سپری کرده باشند
امکانش هست درباره 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) هم هست. که باز تو سرفصلهای جلوتر که بهش رسیدم دوباره اونجا یه مقدار در مورد دکوریتور صحبت میکنیم.
در سرفصل دیزاینپترنها در مورد Decorator و مفهومش بیشتر صحبت میکنیم. در حال حاضر قصد من از مطرح کردن این موضوع فقط آشنایی با نحوه نوشتن Decorator در پایتون بود. در مورد موارد و چرایی استفاده انشالله در آینده مفصلتر صحبت میکنیم.
با احترام
بهترین پاسخ
حسین رمضان پور۲۹ مهر ۱۳۹۹، ۱۵:۵۹
اگر بازم کسی توی فهم اولیه دکوریتور مشکل داره پیشنهاد میکنم بخش اول این مقاله رو بخونه : لینک