Using a Class as a Decorator

Python Decorators haqida o'rganamiz.

SU

Dekorator sifatida Sinfdan Foydalanish

Argumentlarni qabul qiladigan dekorator yaratishning yana bir chiroyli usuli mavjud. Bu usul – maxsus sinf (class) yaratishdir.

Keling, yangi fayl yaratib, uni decorator_class.py deb nomlab, quyidagi kodni qo'shamiz:

# decorator_class.py
 
class info:
 
    def __init__(self, arg1, arg2):
        print('running __init__')
        self.arg1 = arg1
        self.arg2 = arg2
        print('Dekorator argumentlari: {}, {}'.format(arg1, arg2))
 
    def __call__(self, function):
        print('in __call__')
 
        def wrapper(*args, **kwargs):
            print('in wrapper()')
            return function(*args, **kwargs)
 
        return wrapper
 
@info(3, 'Python')
def treble(number):
    return number * 3
 
print()
print(treble(5))

Sinf nomini barcha kichik harflarda yozish odatiy emas. Odatiy ravishda, sinflar nomi bosh harf bilan boshlanadi (title-case). Ammo boshqa misollar bilan bir xil bo'lishi uchun bu yerda kichik harflar bilan yozilgan.

Ushbu sinf faqat ikkita argumentni qabul qiladi. Siz *args va **kwargs-ni ham ishlatishingiz mumkin, ammo bu biroz murakkablashar edi. Bu misolni sodda va tushunarli qilish uchun faqat ikkita argumentni qabul qiluvchi sinf yaratdik. Sinf yaratildiganda, ikkita argumentni ob'ektning atributlari sifatida saqlaydi va ular haqida ma'lumot chiqaradi.

Keyingi qadam — __call__() metodini yaratishdir. Bu maxsus metod sinfni chaqalanadigan qiladi. U dekoratsiya qilinayotgan funksiyani argument sifatida qabul qiladi. So'ngra, ushbu maxsus metod ichida wrapper() funksiyasi joylashadi. E'tibor bering, wrapper() funksiyasiga self uzatilmaydi. U dekoratsiya qilinayotgan funktsiyaning argumentlari va kalit-argumentlarini qabul qiladi.

Qolgan kodlar avvalgi misoldagiga o'xshash.

Bu kodni ishga tushirsangiz, quyidagi natijani ko'rasiz:

in __init__
Dekorator argumentlari: 3, Python
in __call__

in wrapper()
15

Endi siz argumentlarni qabul qiladigan dekoratorni qanday yaratishni bilasiz — ikkala ichma-ich funksiyalar va sinf yordamida. Endi esa, Pythonning o'zida mavjud bo'lgan ba'zi dekoratorlar bilan tanishishga tayyorsiz!

Last updated on

On this page

Xato haqida xabar berish