در پایتون، دکوریتور تابعی است که رفتار تابع دیگری را بدون تغییر کد منبع آن تغییر میدهد. به طور گسترده برای افزودن عملکرد به یک تابع یا کلاس موجود، مانند ورود به سیستم، زمانبندی، احراز هویت و موارد دیگر استفاده میشود.
یکی از مزایای اصلی استفاده از دکوریتورها در پایتون، قابلیت استفاده مجدد کد است. به جای افزودن تابع یکسان به چندین تابع، می توانید یک بار یک دکوریتور بنویسید و آن را برای هر تابع ای که می خواهید اعمال کنید. همچنین به تمیز و منظم نگه داشتن پایه کد شما کمک می کند، زیرا مجبور نیستید یک کد را در چندین مکان تکرار کنید.
مزیت دیگر این است که دکوریتورها به شما این امکان را میدهند که کد ها را از هم جدا کنید و ویژگیها یا رفتارها را به صورت تدریجی بدون تغییر کد تابع اصلی اضافه کنید. این میتواند کد شما را انعطافپذیرتر، قابل نگهداری و سازگارتر با تغییرات در طول زمان کند.
در سایر زبان های برنامه نویسی مانند جاوا یا سی شارپ، تابع های مشابه را می توان به ترتیب با استفاده از "annotations" یا "attributes" به دست آورد.
در این سینتکس، دکوریتور یک شی قابل فراخوان است که تابعی را به عنوان ورودی می گیرد و یک تابع جدید را به عنوان خروجی برمی گرداند. عملکرد جدید به دلیل رفتار اضافه شده توسط دکوریتور متفاوت از عملکرد اصلی است.
خروجی:
۲. مثال دکوراتور همراه با آرگومان:
خروجی:
۳. مثال دکوریتور کلاس:
خروجی:
در پایتون، @property یک دکوریتور built-in است که به شما امکان می دهد متدی را تعریف کنید که به عنوان یک attribute قابل دسترسی باشد و دسترسی و تغییر مقادیر attribute را آسان تر می کند.
مثال:
خروجی:
در مثال بالا، ما از دکوریتور @login_required استفاده می کنیم تا اطمینان حاصل کنیم که فقط کاربران احراز هویت شده می توانند به تابع my_view دسترسی داشته باشند. اگر کاربر سعی کند در حالی که وارد نشده است به این ویو دسترسی پیدا کند، به صفحه لاگین هدایت می شود.
دکوریتور @login_required یک دکوریتور داخلی ارائه شده توسط جنگو است که فرآیند احراز هویت کاربران را ساده می کند. بررسی می کند که آیا کاربر احراز هویت شده است یا خیر و در غیر این صورت، آنها را به صفحه لاگین هدایت می کند.
همچنین می توانید دکوریتورهای کاستوم شده خود را در جنگو ایجاد کنید تا عملکردهای اضافی اضافه کنید یا رفتار ویو ها را بر اساس شرایط خاص تغییر دهید.