Python'da dekorator nima va qanday ishlaydi
Ba’zan mavjud funksiya ga uni o’zgartirmasdan qo’shimcha xatti-harakat qo’shmoqchi bo’lasiz — masalan har chaqirilganda xabar chiqarish. Dekorator aynan shu ish uchun: u funksiyani o’rab, ustiga yangi imkoniyat qo’shadi. Bu — Python’ning kuchli, biroz nozik mavzusi.
Kalit g’oya: funksiya ham qiymat
Python’da funksiyani boshqa funksiyaga uzatish va undan qaytarish mumkin. Funksiya oddiy qiymat kabi ishlatiladi. Dekorator shu imkoniyatga tayanadi: u funksiyani qabul qilib, uni o’ragan yangi funksiyani qaytaradi.
Oddiy dekorator
log dekoratori funksiya chaqirilganini e’lon qiladi:
log salomlash ni oldi, uni ichki ichiga o’radi va yangi funksiyani
qaytardi. Endi salomlash() chaqirilganda avval xabar, keyin asl kod, keyin
yana xabar ishlaydi — asl salomlash esa umuman o’zgarmadi.
@ — dekorator sintaksisi
salomlash = log(salomlash) qatori ko’p uchraydi, shuning uchun Python unga
qisqa yozuv beradi — funksiya ustiga @dekorator:
Bu avvalgi kod bilan aynan bir xil ishlaydi. @log — “bu funksiyani log
bilan o’ra” degani. Bugungi Python kodida dekoratorlar deyarli doim shu @
ko’rinishida yoziladi.
Argumentli funksiyaga dekorator
Yuqoridagi ichki argument qabul qilmaydi. Funksiya
argument olsa, ularni o’tkazib yuborish
kerak. Buning uchun *args, **kwargs ishlatiladi — bu “istalgancha argument”
degani (alohida darsda batafsil ko’riladi):
ichki argumentlarni func ga o’zgarishsiz uzatadi va uning
natijasini qaytaradi — shuning uchun qoshish(3, 5) to’g’ri
8 ni beradi.
Amaliy mashq
O’z dekoratoringizni yozing:
salom()funksiyasini yarating;bezaknomli dekorator yozing — funksiyadan oldin va keyin chiziq chiqarsin;- uni
@bezaksintaksisi bilan qo’llang; - argument oladigan
salom(ism)funksiyasiga ham qo’llang — dekoratorda*args, **kwargskerak bo’ladi; - funksiya nechta marta chaqirilganini sanaydigan dekorator yozib ko’ring.
4-qadamda *args ni olib tashlasangiz qanday xato chiqadi?
Qisqacha xulosa
- Dekorator — funksiyani o’rab, uni o’zgartirmasdan qo’shimcha xatti-harakat qo’shadi.
- U funksiyani qabul qiladi va o’ragan yangi funksiyani qaytaradi.
@dekorator—func = dekorator(func)ning qisqa yozuvi.- Argumentli funksiyalar uchun
*args, **kwargsbilan argumentlar o’tkaziladi. - Asl funksiya natijasini
returnqilishni unutmang.
Bu bilan Python o’rta darajaning bir bosqichini yakunladik. Keyingi darslarda generator, fayl bilan ishlash va boshqa mavzularni ko’ramiz.