decorators
دکوراتورها راهی برای تغییر عملکرد با استفاده از سایر توابع ارائه می کنند. این کارکرد زمانی ایده آل است که شما نیاز به گسترش عملکرد توابعی دارید که شما نمی خواهید آن ها را تغییر دهید. مثال:
def decor(func):
def wrap():
print("============")
func()
print("============")
return wrap
def print_text():
print("Hello world!")
decorated = decor(print_text)
decorated()
ما یک تابع را به نام دکور تعریف کردیم که دارای یک پارامتر واحد است. در داخل دکور، ما یک تابع توریع شده را با نام wrap تعریف کردیم. تابع Warp یک رشته را چاپ می کند،و سپس func () را فراخوانی می کند و یک رشته دیگر را چاپ می کند. تابع دکور تابع warp را به عنوان نتیجه آن باز می گرداند. می توان گفت که متغیر تزئین شده یک نسخه تزئینی print_text است - print_text به همراه یک نوشته دیگر. در حقیقت، اگر ما یک دکور مفید بنویسیم، ممکن است بخواهیم متن print_text را با نسخه دکور شده جایگزین کنیم، بنابراین ما همیشه نسخه plus something را از print_text در اختیارمان خواهیم داشت. این کار با تخصیص مجدد متغیری که شامل تابع ما است انجام می شود:
print_text = decor(print_text)
print_text()
نکته:حالا print_text مربوط به نسخه تزئین شده ما است. در مثال قبلی ما عملمان را با جایگزینی متغیر حاوی تابع با یک نسخه پیچیده دکور کردیم.
def print_text():
print("Hello world!")
print_text = decor(print_text)
این الگو می تواند در هر زمان مورد استفاده قرار گیرد تا هر تابع را تعویض کند. پایتون با پیش آزمون تعریف تابع با نام دکوراتور و نماد @، پشتیبانی می کند تا یک تابع را در دکوراتور تعبیه کند. اگر ما یک تابع را تعریف می کنیم، می توانیم آن را با نماد @ مانند "دکور" کنیم:
@decor
def print_text():
print("Hello world!")
این نتیجه همانند کد بالا خواهد بود. نکته: یک تابع تک می تواند decoration های متعدد داشته باشد.
سلام آقای بیگدلی خسته نباشید
ممنون از آموزش های مفیدتون
بنده چند مدت توی این تابع گیرم و درکش نمیکنم
تو این تابعی که نوشتید
چرا وقتی توی تابع دوم پرانتز های جلوی funرو حذف میکنم کد به صورت خالی اجرا میشه
ممنون میشم یه توضیح بدید که اون پرانتزا کارش چیه و چه کاری رو برای این تابع انجام میده و چرا وقتی از پراتنتز جلوش استفاده میشه به صورت یک پرینت در میاد
پرانتز بعد از اسم یک تابع حکم اجرایی کردن تابع رو داره در غیر اینصورت شما دارید به یک attribute نگاه می کنین که فقط فضای حافظس و نه چیز دیگه وقتی پرانتز جلوش میاد عملکرد هایی که درش اشاره شده رو اجرا می کنه
سلام
اگر بخوايم به جاي hello world از كاربر ورودي بگيريم يه عدد يا متن, بايد چيكار كنيم؟
مشخصا توی ورودی های تابع این موضوع صحبت شده عزیز لطفا به بخش توابع و کار با آن ها مراجعه کنین