راهنمایی بیشتر درباره Decorator

پرسیده شده
فعالیت 902 روز پیش
دیده شده 981 بار
0

سلام

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

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

ممنون

فایل پیوست

1
حذف شده

سلام

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

 

با احترام

فایل پیوست

حسین رمضان پور

توسط

حسین رمضان پور

29 مهر 99

2
حذف شده

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

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

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

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

فایل پیوست

محمدعلی رضا

توسط

محمدعلی رضا

29 مهر 99

حذف شده
جناب علی رضا مواردی که فرمودید رو درک می کنم ولی کمی از لحاظ مفهومی برام قابل هضم نیست. حالا باز منابع شما رو هم که قرار دادید مطالعه می کنم.
حذف شده
این پاسخ قابلیت تبدیل شدن به یه بلاگ‌پست رو داره :)))
پیمان رشیدی

2 آبان 99

حذف شده
پاسخ عالی من الان میخواستم چنین چیزیو تاپیک کنم که دیدم هست با تشکر ; )
Reza Mobaraki

10 اسفند 99

1
حذف شده

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

فایل پیوست

Reza Mobaraki

توسط

Reza Mobaraki

10 اسفند 99

0
حذف شده

آقا دمت گرم خیلی عالی بود

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

دمت گرم آقا محمد علی رضا

فایل پیوست

Navid JN

توسط

Navid JN

16 آبان 00