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?:
Dostları ilə paylaş: |