معرفی decorator در پایتون
decorator باعث میشود که یک تابع تزئین شود. تصور کنید یک تابع داریم و میخواهیم به یک تابع جدیدی تبدیلش کنیم. در واقع همان تابع است با یک سری تغییرات جدید به طوری که همان کارهای قبلی را انجام دهد. همچنین وجود دکوریتور باعث میشود که کارهای جدید دیگری نیز انجام دهد.
برای این منظور دو راه وجود دارد:
۱-یک سری کد اضافی به برنامه اضافه کنیم.
۲-یک تابع جدید بنویسیم که شامل تابع قبلی باشد. به این روش decorator میگویند و نماد @ به این موضوع اختصاص داده شده است.
مقدمهایی بر decorator
در قسمت مقدمهایی بر decorator کد زیر را بررسی میکنیم. در کد زیر یک تابع به نام func داریم که عدد ۱ را return میکند. یک تابع دیگری داریم به نام hello که Hello را return میکند. اگر تابع hello را برابر با یک متغیر به نام greet قرار دهیم، سپس تابع hello را با تابع del پاک کنیم و دوباره تابع hello را فراخوانی کنیم، میبینیم که تابع hello وجود ندارد. ولی اگر greet را فراخوانی کنیم، همچنان این تابع موجود میباشد.
در این بخش برای پیشزمینه در مورد decorator کد زیر را بررسی میکنیم. اگر در کد زیر یک تابع به نام hello ایجاد کنیم و این بار در داخل این تابع دو تابع دیگر به نام greet و welcome بنویسیم. میبینیم که چون تابع greet و welcome در داخل تابع hello فراخوانی شدهاند. در هنگام فراخوانی تابع hello این دو تابع نیز اجرا میشوند. اگر پس از آن بخواهیم تابع greet و یا welcomeرا خارج از محیط تابع hello فراخوانی کنیم، با خطا مواجه میشویم.
اگر در کد زیر یک تابع به نام hello ایجاد کنیم و باز هم در داخل این تابع دو تابع دیگر به نام greet و welcome بنویسیم. میبینیم که چون تابع greet و welcome در داخل تابع hello فراخوانی نشدهاند. و فقط return شدهاند در هنگام فراخوانی تابع hello این دو تابع نیز اجرا نمیشوند. اما اگر تابع hello را برابر یک متغیر قرار دهیم و آن متغیر را به همرا پرانتز print بگیریم. میبینیم که این دو تابع نیز اجرا میشوند.
در کد زیر در تابع cool به دلیل اینکه تابع super_cool داخل این تابع فراخوانی نشده است و فقط return شده است باید تابع cool را برابر یک متغیر قرار داد و متغیر را به همراه پرانتز فراخوانی کرد.
در کد زیر یک تابع را به عنوان ورودی یک تابع other قرار دادهایم. سپس ورودی را که یک تابع است در خود تابع other فراخوانی کنیم. میبینیم که اگر تابع other را فراخوانی کنیم تابعی را که به عنوان ورودی داده بودیم نیز فراخوانی میشود.
نحوه ایجاد decorator
برای ایجاد decorator دو روش وجود دارد. یک روش به این صورت میباشد که تابع دکوریتور را ایجاد میکنیم و تابعی را که میخواهیم به وسیله تابع decorator دکور شود را به عنوان ورودی به تابع دکوریتور میدهیم. در این کد تابع new_decorator تابع decorator میباشد و تابع ورودی که قرار است دکور شود تابع function_need_decorator میباشد.
همچنین در مبحث دکوریتور، میتوان بجای تابع function_need_decorator تابع دیگری مانند hello را به وسیله تابع new_decorator دکور کنیم.
در روش دوم نام تابع decorator را به همراه @ بالای تابعی که قرار است دکور شود مینویسیم.
برای آشنایی بیشتر با مبحث decorator و نحوه کار با آنها میتوانید به دوره جامع آموزش زبان برنامهنویسی پایتون آکادمی رسا مراجعه کنید.