Python dekoratorlari
Dekoratorlar funksiya kodini o‘zgartirmasdan funksiyaga qo‘shimcha xatti-harakatlar qo‘shish imkonini beradi.
Dekorator boshqa funksiyani kirish sifatida qabul qiladigan va yangi funksiyani qaytaradigan funksiyadir.
Asosiy dekorativ
Avval dekoratorni aniqlang, so‘ngra uni funksiya ustidagi @decorator_name bilan qo‘llang.
Misol
Bezatilgan funksiyaning qaytish qiymatini katta harflar bilan yozadigan asosiy dekorator.
def changecase(func):
def myinner():
return func().upper()
return myinner
@changecase
def myfunction():
return "Hello Sally"
print(myfunction())
O‘zingiz sinab ko‘ring »
@changecaseni to‘g‘ridan-to‘g‘ri funksiya ta’rifi ustiga qo‘yish orqali myfunction funksiyasi changecase funksiyasi bilan "bezatiladi".
changecase funksiyasi dekorator hisoblanadi.
myfunction funksiyasi bezatilgan funksiyadir.
Dekoratorni bir necha marta chaqirish
Dekoratorni bir necha marta chaqirish mumkin. Faqat dekoratorni bezatmoqchi bo‘lgan funksiya ustiga qo‘ying.
Misol
@changecase dekoratoridan ikkita funksiyada foydalanish:
def changecase(func):
def myinner():
return func().upper()
return myinner
@changecase
def myfunction():
return "Hello Sally"
@changecase
def otherfunction():
return "I am speed!"
print(myfunction())
print(otherfunction())
O‘zingiz sinab ko‘ring »
Bezatilgan funksiyadagi argumentlar
Argumentlarni talab qiladigan funksiyalar ham bezatilgan bo‘lishi mumkin, shunchaki argumentlarni o‘rash funksiyasiga o‘tkazganingizga ishonch hosil qiling:
Misol
Argumentli funksiyalar ham bezatilgan bo‘lishi mumkin:
def changecase(func):
def myinner(x):
return func(x).upper()
return myinner
@changecase
def myfunction(nam):
return "Hello " + nam
print(myfunction("John"))
O‘zingiz sinab ko‘ring »
*args va **kvarglar
Ba’zan dekorator funksiyasi bezatilgan funksiyadan uzatilgan argumentlar ustidan nazoratga ega bo‘lmaydi, bu muammoni hal qilish uchun o‘rash funksiyasiga(*args, **kwargs)qo‘shing, shu tarzda o‘rash funksiyasi istalgan raqamni va har qanday turdagi argumentlarni qabul qilishi va ularni bezatilgan funksiyaga o‘tkazishi mumkin.
Misol
Funksiyani*argsva**kwargsargumentlari bilan himoyalang:
def changecase(func):
def myinner(*args, **kwargs):
return func(*args, **kwargs).upper()
return myinner
@changecase
def myfunction(nam):
return "Hello " + nam
print(myfunction("John"))
O‘zingiz sinab ko‘ring »
Argumentlar bilan dekorativ
Dekoratorlar boshqa o‘rash darajasini qo‘shish orqali o‘zlarining argumentlarini qabul qilishlari mumkin.
Misol
Argumentni qabul qiladigan va argument qiymatiga qarab korpusni o‘zgartiradigan dekorativ zavod.
def changecase(n):
def changecase(func):
def myinner():
if n == 1:
a = func().lower()
else:
a = func().upper()
return a
return myinner
return changecase
@changecase(1)
def myfunction():
return "Hello Linus"
print(myfunction())
O‘zingiz sinab ko‘ring »
Bir nechta dekorativlar
Bitta funksiyada bir nechta dekorativlardan foydalanishingiz mumkin.
Bu dekorator chaqiruvlarini bir-birining ustiga qo‘yish orqali amalga oshiriladi.
Dekoratorlar funksiyaga eng yaqin bo‘lganidan boshlab teskari tartibda chaqiriladi.
Misol
Katta harf uchun bitta dekorator va salomlashish uchun bitta:
def changecase(func):
def myinner():
return func().upper()
return myinner
def addgreeting(func):
def myinner():
return "Hello " + func() + " Have a good day!"
return myinner
@changecase
@addgreeting
def myfunction():
return "Tobias"
print(myfunction())
O‘zingiz sinab ko‘ring »
Funksiya metama’lumotlarini saqlash
Python funksiyalarida __name__ va __doc__ atributlari yordamida kirish mumkin bo‘lgan metama’lumotlar mavjud.
Misol
Odatda, funksiya nomi __name__ atributi bilan qaytarilishi mumkin:
def myfunction():
return "Have a great day!"
print(myfunction.__name__)
O‘zingiz sinab ko‘ring »
Ammo, funksiya bezatilganda, asl funksiyaning metama’lumotlari yo‘qoladi.
Misol
Nomni bezatilgan funksiyadan qaytarishga harakat qiling va siz bir xil natijaga erisha olmaysiz:
def changecase(func):
def myinner():
return func().upper()
return myinner
@changecase
def myfunction():
return "Have a great day!"
print(myfunction.__name__)
O‘zingiz sinab ko‘ring »
Buni tuzatish uchun Python-da functools.wraps deb nomlangan o‘rnatilgan funksiya mavjud bo‘lib, u asl funksiya nomini va docstringni saqlab qolish uchun ishlatilishi mumkin.
Misol
Asl funksiya nomi va docstringini saqlab qolish uchun functools.wrapsni import qiling.
import functools
def changecase(func):
@functools.wraps(func)
def myinner():
return func().upper()
return myinner
@changecase
def myfunction():
return "Have a great day!"
print(myfunction.__name__)
O‘zingiz sinab ko‘ring »
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
