1. Python tili imkoniyatlari Pythonni ko`chirish



Yüklə 2,19 Mb.
səhifə64/78
tarix19.12.2023
ölçüsü2,19 Mb.
#152124
1   ...   60   61   62   63   64   65   66   67   ...   78
1. Python tili imkoniyatlari Pythonni ko`chirish

Dekoratorlar


Pythonda dekoratorlar va ulardan amaliyotda foydalanish.
Xo`sh, bu nima ekan? Dekoratorlar nima va u qanday ishlashi haqida gaplashish uchun biz oldin Pythonda funksiyalar ham bir ob`yekt sifatida qaralishini esga olishimiz kerak bo`ladi, demak, ularni boshqa funksiyalardan chaqirish va argument sifatida uzatish ham mumkin.
Bularni esga olgan holda, endi dekoratorlarga o`tishimiz mumkin. Dekoratorlar – bu umuman olganda, funksiyaning kodini o`zgartirmagan holda, uning bajaradigan ishini o`zgartirish imkonini beruvchi “qobiq”dir.
O`zimizning shaxsiy dekoratorimizni “qo`lda” yaratamiz.

>>> def my_shiny_new_decorator(function_to_decorate):
... # Dekorator o`zining tarkibida “qobiq” funksiyani tavsiflaydi. U dekoratsiyalanayotgan funksiya atrofini o`raydi.
... def the_wrapper_around_the_original_function():
... print("Men – funksiyani chaqirilishidan oldin ishlaydigan funksiyaman")
... function_to_decorate() # Funksiyaning o`zi
... print("Men esa, keyin ishga tushadigan kodman")
... # Bu funksiyani qaytaraman
... return the_wrapper_around_the_original_function
...
>>> # Faraz qilaylik, bizda biz endi o`zgartirish niyatimiz bo`lmagan funksiya bor.
>>> def stand_alone_function():
... print("Men yolg`iz funksiyaman, sen meni o`zgartirmassan, axir?!")
...
>>> stand_alone_function()
Men yolg`iz funksiyaman, sen meni o`zgartirmassan, axir?!
>>> #Lekin uning ishini o`zgartirish uchun biz uni dekoratsiyalashimiz, ya`ni, #dekoratorga uzatishimiz
>>> # U boshlang`ich funksiyani bizga kerakli ixtiyoriy funksiyaga o`raydi va foydalanishga tayyor bo`lgan yangisini qaytaradi.
>>> stand_alone_function_decorated = my_shiny_new_decorator(stand_alone_function)
>>> stand_alone_function_decorated()
Men – funksiyani chaqirilishidan oldin ishlaydigan funksiyaman
Men yolg`iz funksiyaman, sen meni o`zgartirmassan, axir?!
Men esa, keyin ishga tushadigan kodman

Balki siz endi har safar stand_alone_function ni chaqirganimizda uning o`rnida stand _alone_function_decorated chaqirilishi istarmiz. U holda, buning uchun shunchaki, stand_alone_function ni qayta yozib chiqamiz.





>>> stand_alone_function = my_shiny_new_decorator(stand_alone_function)
>>> stand_alone_function()
Men – funksiyani chaqirilishidan oldin ishlaydigan funksiyaman
Men yolg`iz funksiyaman, sen meni o`zgartirmassan, axir?!
Men esa, keyin ishga tushadigan kodman

Umuman olganda mana shuning o`zi dekoratordir. Dekoratorlarning sintaksisidan foydalangan holda oldingi misolni quyidagicha yozish mumkin:



>>> @my_shiny_new_decorator
... def another_stand_alone_function():
... print("µØÙÇÉã ÓÌÔæ É ÖÕÑÕÌ")
...
>>> another_stand_alone_function()
Men – funksiyani chaqirilishidan oldin ishlaydigan funksiyaman
Meni tinch qo`ying.
Men esa, keyin ishga tushadigan kodman

Ya`ni, pythondagi dekoratorlar – bu ko`rinish konstruksiyalari uchun sintaktik shakardir.



another_stand_alone_function = my_shiny_new_decorator(another_stand_alone_function)



>>> def bread(func):
... def wrapper():
... print()
... func()
... print("<\______/>")
... return wrapper
...
>>> def ingredients(func):
... def wrapper():
... print("#pomidorlar#")
... func()
... print("~salat~")
... return wrapper
...>>> def sandwich(food="—go`sht--"):
... print(food)
...>>> sandwich()
--go`sht--
>>> sandwich = bread(ingredients(sandwich))
>>> sandwich()
#pomidorlar#
--go`sht--
~salat~
<\______/>

Bunda albatta, bitta funksiya uchun bir nechta dekoratorni qo`llash mumkindir, masalan:


Va dekoratorlarning sintaksisidan foydalanib, quyidagilarni kiritamiz:



>>> @bread
... @ingredients
... def sandwich(food="--ÉÌÙÞÏÔÇ--"):
... print(food)
...
>>> sandwich()
#pomidorlar#
--go`sht--
~salat~
<\______/>

Bundan tashqari shuni ham esda saqlash kerakki, dekoratsiyalash tartibi ham muhimdir. Oldingi misol bilan solishtirib ko`ring.



>>> @ingredients
... @bread
... def sandwich(food="--ÉÌÙÞÏÔÇ--"):
... print(food)
...
>>> sandwich()
#pomidorlar#
--go`sht--
<\______/>
~salat~



Yüklə 2,19 Mb.

Dostları ilə paylaş:
1   ...   60   61   62   63   64   65   66   67   ...   78




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©genderi.org 2024
rəhbərliyinə müraciət

    Ana səhifə