دكوراتورها مضمون خيلي بي آلايش و در عين اكنون كاربردي مي باشند كه براي مثال اگه با فلسك كار بكنيد حتما نياز خواهيد داشت كه ازش به كار گيري بكنيد . اما با وجود اين كه دكوراتورها خيلي معمولي ميباشند البته بعضيا حقيقتا دركش نميكنند!
خب ايده اينه كه بتونيم از روش يك تابع , كاركرد يك تابع ديگه رو تغييرو تحول بديم و يا اين كه خوب تر بگيم كه يه تابع رو توسعه بديم .
فكر كنيد تابع ۱ رو داريد و تابع ۲ … حال ميخوايد از روش تابع ۱ , كاري بكنيد كه تابع ۲ شغل هاي بيشتري رو انجام بده .
بياييد يه نمونه بي آلايش رو در لحاظ بگيريم :
فكر كنيد اينجانب يه تابع دارم به نام style كه هر متني كه واردش بشه رو به صورتي قشنگ برميگردونه!
فكر كنيد يه تابع ديگه نيز دارم كه نوشته رو چاپ ميكنه . درحال حاضر ميخوام بجاي اين كه فرآيند چاپ نوشته معمولي انجام بشه , از اقتدار تابع style براي اين كار به كارگيري بكنم .
پس نياز است كه تابع style تحت عنوان محل ورود يك تابع ديگر رو بگيره :
1234def style ( func1 ) :
print ( ' - - - - - - - - - - - - - - - - - - - - ' )
func1 ( )
print ( ' - - - - - - - - - - - - - - - - - - - - ' )
درحال حاضر تابع دوممون رو كه صرفا قراره يه نوشته بي آلايش رو چاپ بكنه تعريف مي كنيم :
12def print _ some _ text ( ) :
print ( ( Hello World ( )
اكنون نياز ميباشد كه تابع دوم رو تحت عنوان آرگومان براي تابع اولمون گزينش كنيم :
1style ( print _ some _ text )
مسئله نماد @ چيه؟
اين شد يه چيزي! پايتون يه ميانبر معمولي برامون ساخت كرده كه از روش اون ميتونيم فارغ از فراخواني نصيب انتها , دكوراتور رو اعمال بكنيم . براي اينكار كافيه قبلي از تعريف تابع دومين @ را همراه با اسم تابع
اولي بنويسيد:
1234567@style
def print_some_text():
print("Hello World")
print_some_text()
حالا يه مشكل پيش مياد. تابع اصلي كه نوشتيم يا همون style يه بخش مهمي نداره! قسمت return … اينطوري يه تايپ ارور ميگيريم چرا كه تابع مقدار NoneType رو برميگردونه! براي اين كار ميتونيم يه تابع ديگه داشته باشيم كه اون تابع كارهاي استايل دهي رو انجام ميده و در نهايت تابع style همون تابع رو برميگردونه. براي اين كار به تعريف تابع style برمي گرديم و مثل زير ويرايشش ميكنيم:
1234567def style(func1):
def final():
print('------------')
func1()
print('------------')
return final
حالا كد رو اجرا كنيد متوجه ميشيد كه همه چيز بدون مشكل اجرا ميشه!
دكوراتورها مضمون خيلي بي آلايش و در عين اكنون كاربردي مي باشند كه براي مثال اگه با فلسك كار بكنيد حتما نياز خواهيد داشت كه ازش به كار گيري بكنيد . اما با وجود اين كه دكوراتورها خيلي معمولي ميباشند البته بعضيا حقيقتا دركش نميكنند!
خب ايده اينه كه بتونيم از روش يك تابع , كاركرد يك تابع ديگه رو تغييرو تحول بديم و يا اين كه خوب تر بگيم كه يه تابع رو توسعه بديم .
فكر كنيد تابع ۱ رو داريد و تابع ۲ … حال ميخوايد از روش تابع ۱ , كاري بكنيد كه تابع ۲ شغل هاي بيشتري رو انجام بده .
بياييد يه نمونه بي آلايش رو در لحاظ بگيريم :
فكر كنيد اينجانب يه تابع دارم به نام style كه هر متني كه واردش بشه رو به صورتي قشنگ برميگردونه!
فكر كنيد يه تابع ديگه نيز دارم كه نوشته رو چاپ ميكنه . درحال حاضر ميخوام بجاي اين كه فرآيند چاپ نوشته معمولي انجام بشه , از اقتدار تابع style براي اين كار به كارگيري بكنم .
پس نياز است كه تابع style تحت عنوان محل ورود يك تابع ديگر رو بگيره :
1234def style ( func1 ) :
print ( ' - - - - - - - - - - - - - - - - - - - - ' )
func1 ( )
print ( ' - - - - - - - - - - - - - - - - - - - - ' )
درحال حاضر تابع دوممون رو كه صرفا قراره يه نوشته بي آلايش رو چاپ بكنه تعريف مي كنيم :
12def print _ some _ text ( ) :
print ( ( Hello World ( )
اكنون نياز ميباشد كه تابع دوم رو تحت عنوان آرگومان براي تابع اولمون گزينش كنيم :
1style ( print _ some _ text )
مسئله نماد @ چيه؟
اين شد يه چيزي! پايتون يه ميانبر معمولي برامون ساخت كرده كه از روش اون ميتونيم فارغ از فراخواني نصيب انتها , دكوراتور رو اعمال بكنيم . براي اينكار كافيه قبلي از تعريف تابع دومين @ را همراه با اسم تابع
اولي بنويسيد:
1234567@style
def print_some_text():
print("Hello World")
print_some_text()
حالا يه مشكل پيش مياد. تابع اصلي كه نوشتيم يا همون style يه بخش مهمي نداره! قسمت return … اينطوري يه تايپ ارور ميگيريم چرا كه تابع مقدار NoneType رو برميگردونه! براي اين كار ميتونيم يه تابع ديگه داشته باشيم كه اون تابع كارهاي استايل دهي رو انجام ميده و در نهايت تابع style همون تابع رو برميگردونه. براي اين كار به تعريف تابع style برمي گرديم و مثل زير ويرايشش ميكنيم:
1234567def style(func1):
def final():
print('------------')
func1()
print('------------')
return final
حالا كد رو اجرا كنيد متوجه ميشيد كه همه چيز بدون مشكل اجرا ميشه!