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