Stucking Decorators

Python Decorators haqida o'rganamiz.

SU

Dekoratorlarni Birlashtirish

Ko‘pincha, bir funktsiya uchun faqat bitta dekorator ishlatiladi. Ammo bu majburiy emas. Siz bir nechta dekoratorlarni bitta funktsiyaga qo‘llashingiz mumkin.

Quyidagi misolni ko‘rib chiqaylik:

def bold(func):
    def wrapper():
        return "<b>" + func() + "</b>"
    return wrapper
 
def italic(func):
    def wrapper():
        return "<i>" + func() + "</i>"
    return wrapper
 
@bold
@italic
def formatted_text():
    return 'Python rocks!'
 
print(formatted_text())

bold() va italic() dekoratorlari funktsiya tomonidan qaytarilgan qiymatga <b> va <i> HTML teglari qo‘shadi.

Dekoratorlar tartibi muhim: Python dekoratorlarni pastdan yuqoriga (ya'ni, funktsiyaga eng yaqin dekorator birinchi qo‘llanadi), lekin dekoratsiya qilingan funktsiyani yuqoridan pastga (ya'ni, manba kodida qanday ko‘rsatilgan bo‘lsa) chaqiradi. Shunday qilib, bu misolda formatted_text avval ta'riflanadi, keyin italic dekoratori qo‘llaniladi va oxirida bold() dekoratori qo‘llaniladi; dekoratsiya qilingan formatted_text funktsiyasi chaqirilganda, avval bold ishga tushadi, keyin italic ishlaydi va nihoyat, asl formatted_text chaqiriladi.

Ushbu kodni ishga tushirganingizda, quyidagi natijani ko‘rasiz:

<b><i>Python rocks!</i></b>

Bir nechta dekoratorlarni qanday qo‘llayotganingizni yaxshiroq tushunishingiz uchun, bu misolni shunday yozamizki, har bir dekorator qaysi funktsiyaga qo‘llanayotganini chop etsin:

def bold(func):
    print(f'Siz {func.__name__} funksiyasini bold bilan o‘rab oldingiz')
    def bold_wrapper():
        return "<b>" + func() + "</b>"
    return bold_wrapper
 
def italic(func):
    print(f'Siz {func.__name__} funksiyasini italic bilan o‘rab oldingiz')
    def italic_wrapper():
        return "<i>" + func() + "</i>"
    return italic_wrapper
 
@bold
@italic
def formatted_text():
    return 'Python rocks!'
 
print(formatted_text())

Bu kodni ishga tushirganingizda quyidagi natijani ko‘rasiz:

Siz formatted_text funksiyasini italic bilan o‘rab oldingiz
Siz italic_wrapper funksiyasini bold bilan o‘rab oldingiz
<b><i>Python rocks!</i></b>

Bu misol formatted_text() funktsiyasi italic() dekoratori tomonidan o‘ralganligini, keyin italic() dekoratori tomonidan yaratilgan italic_wrapper() funktsiyasining bold() dekoratori tomonidan o‘ralganligini ko‘rsatadi.

Endi dekoratorlarga argumentlarni qanday uzatishni o‘rganamiz!

Last updated on

On this page

Xato haqida xabar berish