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:

Python

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:

Python

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):

Python

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:

  1. salom() funksiyasini yarating;
  2. bezak nomli dekorator yozing — funksiyadan oldin va keyin chiziq chiqarsin;
  3. uni @bezak sintaksisi bilan qo’llang;
  4. argument oladigan salom(ism) funksiyasiga ham qo’llang — dekoratorda *args, **kwargs kerak bo’ladi;
  5. 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.
  • @dekoratorfunc = dekorator(func) ning qisqa yozuvi.
  • Argumentli funksiyalar uchun *args, **kwargs bilan argumentlar o’tkaziladi.
  • Asl funksiya natijasini return qilishni unutmang.

Bu bilan Python o’rta darajaning bir bosqichini yakunladik. Keyingi darslarda generator, fayl bilan ishlash va boshqa mavzularni ko’ramiz.

Bu dars foydali bo'ldimi?

marta ko'rildi