درک دکوراتورهای پایتون، با مثال
این مقاله به شما کمک می کند تا مفهوم دکوراتورها در برنامه نویسی پایتون و بهترین روش استفاده از آنها را درک کنید. ما توضیح خواهیم داد که دکوراتورهای Python چیست، نحو آنها چگونه است، چگونه آنها را در یک اسکریپت یا چارچوب شناسایی کنیم، و چگونه آنها را خودتان اعمال کنید.طراحی سایت
یک تزیین کننده تابع در پایتون فقط تابعی است که تابع دیگری را به عنوان آرگومان می گیرد و عملکرد تابع تزئین شده را بدون تغییر ساختار آن گسترش می دهد. یک دکوراتور عملکرد دیگری را می پیچد، رفتار آن را تقویت می کند و آن را برمی گرداند.
مفهوم دکوراتورها در پایتون به حفظ کد شما کمک میکند DRY. دکوراتور تابع از تکرار غیرضروری در پایه کد شما جلوگیری می کند، زیرا برخی از بیت های تکراری کد را می توان به هم متصل کرد تا تبدیل به تزئین کننده عملکرد شود. همانطور که در استفاده از پایتون برای توسعه پیشروی می کنید، دکوراتورها می توانند در تجزیه و تحلیل و لاگ کمک کنند. آنها همچنین برای تنظیم اعتبارسنجی و بررسی های زمان اجرا حیاتی هستند.
همانطور که ادامه میدهیم، فرض میکنم که شما درک اولیه از توابع و برنامهنویسی پایتون دارید و حداقل پایتون 3.8 را روی دستگاه خود نصب کردهاید.
معرفی سایت: https://globalchat.ir/آیا-کسب-و-کار-طراحی-وب-شما-نیاز-به-برندس/
چیزهایی که قبل از پرداختن به دکوراتورهای پایتون باید بدانید
در پایتون، توابع اشیاء درجه یک هستند، به این معنی که می توانند آرگومان ها را دریافت کنند یا به عنوان آرگومان ارسال شوند. برای درک کامل مفهوم دکوراتورها، چند نکته وجود دارد که باید بدانید.
یک تابع یک شی است، به این معنی که می توان آن را به متغیر دیگری نسبت داد
دف سلام():
چاپ("سلام جان")
greet_john = سلام کنید
greet_john()
>>>
سلام جان
همیشه به یاد داشته باشید که همه چیز در پایتون یک شی است. همانطور که مقادیری را به یک متغیر اختصاص می دهید، در صورت لزوم می توان یک تابع را نیز به یک متغیر اختصاص داد. هنگامی که در مورد دکوراتورها یاد می گیرید، این مهم است.
یک تابع را می توان از تابع دیگری برگرداند
دف سلام():
دف تبریک_در_طلوع():
چاپ("صبح بخیر")
بازگشت greeting_at_dawn
سلام = greet()
سلام()
>>>
صبح بخیر
یک تابع داخلی در پایتون را می توان از تابع بیرونی برگرداند. این بخشی از مفاهیم برنامه نویسی کاربردی است که با آن مواجه خواهید شد.
یک تابع را می توان به عنوان آرگومان یک تابع دیگر ارسال کرد
دف سلام_برخی(func):
چاپ("صبح بخیر"، end=' ')
func()
def say_name():
چاپ("جان")
سلام(say_name)
>>>
صبح بخیر جان
تابعی که آرگومان تابع را دریافت می کند به عنوان عملکرد مرتبه بالاتر شناخته می شود.
نکات ذکر شده در بالا هنگام یادگیری پیاده سازی دکوراتورها و استفاده موثر از آنها در برنامه پایتون مهم است.
نحوه کار دکوراتورهای پایتون
یک تابع دکوراتور ساده با یک تعریف تابع، تابع تزئین، و سپس یک تابع تو در تو در تابع پوشش بیرونی شروع می شود.
هنگام تعریف دکوراتور، این دو نکته اصلی را همیشه در نظر داشته باشید:
- برای پیاده سازی دکوراتورها، یک تابع بیرونی تعریف کنید که آرگومان تابع را می گیرد.
- یک تابع لفاف را در داخل تابع تزئین کننده بیرونی قرار دهید، که عملکرد تزئین شده را نیز می پیچد.
اصلی ترین عملکرد دکوراتور در قطعه کد زیر به این صورت است:
دف افزایش_تعداد(func):
def افزایش_یک_یک():
چاپ("افزایش عدد 1 ..." )
number_plus_one = func() + 1
بازگشت number_plus_one
بازگشت افزایش_به_یک
def دریافت_شماره():
بازگشت 5
get_new_number = growth_number(get_number)
چاپ(get_new_number())
>>>
افزایش عدد بر اساس 1 ...
6
با نگاهی به کد بالا، تابع بیرونی increase_number
– همچنین به عنوان decorator شناخته می شود – یک آرگومان تابع func
دریافت می کند. increase_by_one
تابع پوششی است که در آن تابع تزئین شده get_number
یافت می شود. دکوراتور به متغیر دیگری اختصاص داده می شود. هنگام استفاده از دکوراتورهای پایتون، یک نحو دکوراتور به این شکل است. با این حال، راه بسیار سادهتری برای نشان دادن دکوراتورها وجود دارد.
یک تابع دکوراتور ساده زمانی که با پیشوند @
شروع می شود و با تابع تزئین شده در زیر آن همراه می شود، به راحتی قابل شناسایی است. مثال قبلی را می توان به شکل زیر تغییر داد:
دف افزایش_تعداد(func):
def افزایش_یک_یک():
چاپ("افزایش عدد 1 ..." )
number_plus_one = func() + 1
بازگشت number_plus_one
بازگشت افزایش_به_یک
@increase_number
def دریافت_شماره():
بازگشت 5
چاپ(get_number())
>>>
افزایش عدد بر اساس 1 ...
6
نمونهها نشان میدهند که یک دکوراتور عملکرد آرگومان تابع خود را گسترش میدهد.
توابع دکوراتور با پارامترها
مواردی وجود دارد که ممکن است لازم باشد پارامترها را به دکوراتور منتقل کنید. راه حل این است که پارامترها را به تابع wrapper منتقل کنید، که سپس به تابع تزئین شده منتقل می شود. مثال زیر را ببینید:
def multiply_numbers(func):
def multiply_two_numbers(num1، num2):
چاپ("ما دو عدد {} و {} را ضرب میکنیم" .قالب(num1، num2))
بازگشت تابع(num1، num2)
بازگشت multiply_two_numbers
@multiply_numbers
def multiply_two_given_numbers(num1، num2):
بازگشت f'{num1} * {num2} = {num1 * num2 }
چاپ(multiply_two_given_numbers(3، 4))
>>>
ما دو عدد را ضرب می کنیم 3 و 4
3 * 4 = 12
داشتن پارامترهایی که به تابع داخلی یا تابع تو در تو منتقل میشوند، آن را حتی قویتر و قویتر میکند، زیرا انعطافپذیری بیشتری برای دستکاری عملکرد تزئین شده میدهد. هر تعداد آرگومان (*args
) یا آرگومان های کلمه کلیدی (**kwargs
) را می توان به تابع تزئین شده ارسال کرد. *args
امکان جمع آوری همه آرگومان های موقعیتی را فراهم می کند، در حالی که **kwargs
برای همه آرگومان های کلیدواژه مورد نیاز در طول فراخوانی تابع است. بیایید به یک مثال ساده دیگر نگاه کنیم:
def decorator_func(decorated_func):
def wrapper_func(*args، **kwargs):
چاپ(f' وجود دارد {len(args)} موقعیتی آرگومان ها و {len(kwargs)} آرگومان ها)
بازگشت dekored_func(*args، **kwargs)
بازگشت wrapper_func
@decorator_func
def names_and_age(age1، age2، name1='Ben'، name2='Harry'):
بازگشت f'{name1} {age1} ساله و {name2} {age2} است ساله"
چاپ(names_and_age(12، 15، name1 ="لیلی"، name2="Ola"))
>>>
2 آرگومان های موقعیتی و 2 آرگومان های کلیدواژه وجود دارد
لیلی است 12 ساله و اولا 15 ساله است
از مثال بالا، *args
تکرارپذیری از آرگومانهای موقعیتی را به صورت چند تایی تشکیل میدهد، در حالی که **kwargs
یک فرهنگ لغت از آرگومانهای کلیدواژه را تشکیل میدهد.
چند دکوراتور یا زنجیر دکوراتور در پایتون
هنگام استفاده از تزیین کنندههای تابع در پروژه پایتون، چندین گزینه برای بررسی وجود دارد. مورد استفاده دیگر، زنجیر کردن دکوراتورها (دو یا بیشتر) به یک عملکرد است. یک عملکرد را می توان با بیش از یک دکوراتور (چند دکوراتور) تزئین کرد و این کار با چیدن یک دکوراتور روی دیگری بدون ترتیب خاصی به دست می آید. همانطور که در مثال زیر مشاهده می شود، صرف نظر از ترتیب قرار گرفتن چندین دکوراتور روی هم، خروجی یکسانی خواهید داشت:
دف افزایش_دکوراتور(func):
def افزایش_دو_دو():
چاپ("افزایش تعداد 2")
new_number = تابع()
بازگشت new_number + 2
بازگشت افزایش_دو_دو
def decrease_decorator(func):
def کاهش_یک_یک():
چاپ('کاهش تعداد 1')
new_number = تابع()
بازگشت new_number - 1
بازگشت کاهش_بی_یک
@increase_decorator
@decrease_decorator
def دریافت_شماره():
بازگشت 5
چاپ(get_number())
>>>
در حال افزایش تعداد 2
کاهش تعداد با 1
6
موارد استفاده واقعی از دکوراتورهای پایتون
یک روش بسیار محبوب برای استفاده از دکوراتورها در پایتون، ثبت زمان است. این به یک برنامه نویس کمک می کند تا مقدار زمانی را که یک تابع برای اجرای آن به عنوان روشی برای اندازه گیری کارایی نیاز دارد، بداند.
یادآوری روش جالب دیگری برای استفاده از دکوراتورها در پایتون است. هنگام انجام محاسبات بعداً، نتایج حاصل از فراخوانی تابع را که بدون هیچ تغییری تکرار میشوند، میتوان به راحتی به خاطر آورد. شما می توانید به سادگی یک تابع را با تزئینات به خاطر بسپارید.
دکوراتورهای داخلی پایتون مانند @classmethod
(روش کلاس)، @staticmethod
(روش استاتیک) و @property
بسیار محبوب هستند. در الگوی دکوراتور OOP پایتون.
نتیجه گیری
دکوراتورهای پایتون اصل DRY مهندسی نرم افزار را اجرا می کنند زیرا به عنوان کد قابل استفاده مجدد عمل می کنند. به بسیاری از توابع پایتون فکر کنید که می توانید به دکوراتورها تغییر دهید. در این مقاله به بررسی اشکال مختلف دکوراتورها پرداخته ایم. دکوراتورهای کلاس نیز وجود دارد، اگرچه ما در اینجا به آنها اشاره نکرده ایم.
دکوراتورها اضافه کردن قابلیتهای اضافی به یک تابع، روش یا کلاس ساده را بدون نیاز به تغییر کد منبع آن در حالی که کد شما را خشک نگه میدارند، آسانتر میکنند. برای درک بهتر الگوی دکوراتور، عملکردهای تزئین را به تنهایی امتحان کنید.
منبع: https://iransite.com