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.


ULASHISH

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!