1. Python tili imkoniyatlari Pythonni ko`chirish


Dekorator tomonidan funksiya argumentlarini uzatish



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

Dekorator tomonidan funksiya argumentlarini uzatish.



>>> def a_decorator_passing_arguments(function_to_decorate):
... def a_wrapper_accepting_arguments(arg1, arg2):
... print("Men mana bularni qabul qildim:", arg1, arg2)
... function_to_decorate(arg1, arg2)
... return a_wrapper_accepting_arguments
...
>>> # Endi biz funksiyani chaqirganimizda, uning “qobig`i”ni chzqiramiz
>>> # Unga argumentlarni uzatamiz, u esa, o`z navbatida ularni dekoratsiyalanayotgan funksiyaga uzatadi
>>> @a_decorator_passing_arguments
... def print_full_name(first_name, last_name):
... print("Mening ismim:", first_name, last_name)
...
>>> print_full_name("Ulug`bek", "Mamatqulov")
Men mana bularni qabul qildim: Ulug`bek Mamatqulov
Mening ismim Ulug`bek Mamatqulov

Biz yuqorida ko`rib chiqqan barcha dekoratorlar 1 ta juda muhim funksionalga ega emas edilar: dekoratsiyalanayotgan funksiyaga argumentlarni uzatish. Lekin, bu ishni ham amalga oshirishning qiyinchilik joyi yo`q.


Metodlarni dekoratsiyalash



>>> def method_friendly_decorator(method_to_decorate):
... def wrapper(self, lie):
... lie -= 3
... return method_to_decorate(self, lie)
... return wrapper
...
>>> class Lucy:
... def __init__(self):
... self.age = 32
... @method_friendly_decorator
... def sayYourAge(self, lie):
... print("Mening yoshim {} da, siz qancha berasiz?".format(self.age + lie))
...
>>> l = Lucy()
>>> l.sayYourAge(-3)
Mening yoshim 26 da, siz qancha berasiz?

Alohida e`tibor talab qiladigan jihatlardan biri shundaki, Pythondagi funksiya va metodlar metodlarning har doim birinchi parametr sifatida ob`yektning o`ziga (self) havolani kutaishini hisobga olinmasa, bir biridan farq qilmaydi. Bundan kelib chiqadiki, biz metodlar uchun ham xuddi funksiyalar kabi (faqat self ni esdan chiqarmagan holda) dekoratorlar yaratishimiz mumkin ekan.




>>> def a_decorator_passing_arbitrary_arguments(function_to_decorate):
... # Ushbu “qobiq” har qanday argumentlarni qabul qiladi
... def a_wrapper_accepting_arbitrary_arguments(*args, **kwargs):
... print("Menga biror narsa berib yuborishdimi?:")
... print(args)
... print(kwargs)
... function_to_decorate(*args, **kwargs)
... return a_wrapper_accepting_arbitrary_arguments
...
>>> @a_decorator_passing_arbitrary_arguments
... def function_with_no_argument():
... print("Python is cool, no argument here.")
...
>>> function_with_no_argument()
Menga biror narsa berib yuborishdimi?:
()
{}

Albatta, agar biz maksimal tarzda umumiy dekorator yaratib, uni har qanday funksiya yoki metodga nisbatan qo`llanilishini istasak, argumentlarni ochish usulidan foydalanishimiz mumkin.



Python is cool, no argument here.
>>> @a_decorator_passing_arbitrary_arguments
... def function_with_arguments(a, b, c):
... print(a, b, c)
...
>>> function_with_arguments(1, 2, 3)
Menga biror narsa berib yuborishdimi?:
(1, 2, 3)
{}
1 2 3
>>> @a_decorator_passing_arbitrary_arguments
... def function_with_named_arguments(a, b, c, platypus="Nimaga yo`q?"):
... print("{} , {} va {} lar o`rdakburularni yoqtirishadimi? {} ".format(a, b, c, platypus))
...
>>> function_with_named_arguments("Bill", "Linus", "Stiv", platypus="Aniq ha!")
Menga biror narsa berib yuborishmadimi?:
('Bill', 'Linus', 'Stiv')
{'platypus': Aniq ha!'}
Bill, Linus va Stiv o`rdakburunlarni yoqtirishadimi? Aniq ha!
>>> class Mary(object):
... def __init__(self):
... self.age = 31
... @a_decorator_passing_arbitrary_arguments
... def sayYourAge(self, lie=-3): Endi biz odatiy qiymatni ko`rsata olamiz
... print("Mening yoshim {} da, Siz qancha berasiz?".format(self.age + lie))
...
>>> m = Mary()
>>> m.sayYourAge()
Menga biror narsa berib yuborishmadimi?
(<__main__.Mary object at 0x7f6373017780>,)
{}
Mening yoshim 28 da, siz qancha berasiz?:



Yüklə 2,19 Mb.

Dostları ilə paylaş:
1   ...   61   62   63   64   65   66   67   68   ...   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ə