توجه داشته باشید که در این مثال، وقتی inner_function را برمیگردانیم، آن را فراخوانی نکردیم.
ما فقط مرجع را به آن برگرداندیم تا بتوانیم بعداً آن را ذخیره و فراخوانی کنیم:
returned_function = outer_function() # outer_funciton is called returned_function() # inner_function is called
اگر شما هم مثل من هستید، ممکن است این موضوع جالب به نظر برسد، اما هنوز هم احتمالاً از خود می پرسید که چگونه می تواند در برنامه های واقعی مفید باشد. این چیزی است که ما در یک لحظه به آن نگاه خواهیم کرد!
نحوه ایجاد دکوراتور در پایتون
پذیرش توابع به عنوان آرگومان، تعریف توابع در توابع دیگر و برگرداندن آنها دقیقاً همان چیزی است که برای ایجاد دکوراتورها در پایتون باید بدانیم. ما از دکوراتورها برای افزودن قابلیت های اضافی به عملکردهای موجود استفاده می کنیم.
به عنوان مثال، اگر میخواهیم یک دکوراتور ایجاد کنیم که 1 را به مقدار بازگشتی هر تابع اضافه کند، میتوانیم این کار را به این صورت انجام دهیم:
def add_one_decorator(func): def add_one(): value = func() return value + 1 return add_one
حال اگر تابعی داشته باشیم که عددی را برمی گرداند، می توانیم از این دکوراتور برای اضافه کردن 1 به هر مقداری که خروجی می دهد استفاده کنیم.
def example_function(): return 1 final_value = add_one_decorator(example_function) print(final_value()) # 2
در این مثال، تابع add_one_decorator را فراخوانی می کنیم و مرجع را به example_function منتقل می کنیم.
وقتی تابع add_one_decorator را فرا میخوانیم، یک تابع جدید به نام add_one ایجاد میکند که درون آن تعریف شده و یک مرجع به این تابع جدید برمیگرداند. ما این تابع را در متغیر final_value ذخیره می کنیم.
بنابراین، هنگام اجرای تابع final_value، تابع add_one فراخوانی می شود.
تابع add_one تعریف شده در add_one_decorator سپس example_function را فراخوانی می کند، مقدار آن را ذخیره می کند و یکی به آن اضافه می کند.
در نهایت، این منجر به بازگشت 2 و چاپ به کنسول می شود.
فرآیند نحوه اجرای کد
توجه داشته باشید که چگونه برای تغییر مقدار بازگشتی آن و افزودن عملکرد به آن، مجبور نبودیم که example_function اصلی را تغییر دهیم. این چیزی است که دکوراتورها را بسیار مفید می کند!
فقط برای روشن شدن، دکوراتورها مختص پایتون نیستند. آنها مفهومی هستند که می توانند در سایر زبان های برنامه نویسی به کار روند. اما در پایتون، می توانید به راحتی با استفاده از نحو @ از آنها استفاده کنید.
نحوه استفاده از سینتکس @ در پایتون
کاراکتر @
همانطور که در بالا دیدیم، زمانی که می خواهیم از دکوراتورها استفاده کنیم، باید تابع دکوراتور را فراخوانی کنیم و تابعی را که می خواهیم تغییر دهیم، عبور دهیم.
در پایتون، میتوانیم از نحو @ برای کارآمدتر بودن استفاده کنیم.
@add_one_decorator def example_function(): return 1
با نوشتن @add_one_decorator در بالای تابع ما، معادل زیر است:
example_function = add_one_decorator(example_function)