Домой

Последняя активность

  

Декораторы функций в Python

PyDeKolt avatar PyDeKolt (0) [#] (27.05.2013 / 16:13)
Декораторы функций - обеспечивают способ определять специальные режимы работы для функции, обертывая их дополнительным слоем логики, реализованной в виде других функций.
  1. class A:
  2. @staticmethod # декоратор в Python для создания статических методов
  3. def summ(x,y):
  4. return x+y
  5. a = A.summ(6,7)
  6. print a
  7. # 13
  8. class B: # альтернативная реализация класса А
  9. def summ(x,y):
  10. return x+y
  11. summ = staticmethod(summ)
  12. b = B.summ(6,7)
  13. print b
  14. # 13
  15. class Counter: # класс как декоратор
  16. def __init__(self, func): # принимаем в качестве параметра декорируемую функцию
  17. self.func = func # запоминаем декорируемую функцию
  18. self.calls = 0
  19. def __call__(self, *args): # вызов декоратора, *args - аргументы декорируемой функции
  20. self.calls += 1
  21. if self.calls >= 3:
  22. print "function summ call %s" % (self.calls,) # если функция summ была запущена 3 или больше раз
  23. return self.func(*args)
  24. @Counter
  25. def summ(a,b,c):
  26. return a+b+c
  27. print summ(5,9,2)
  28. print summ(1,7,2)
  29. print summ(4,9,3)
  30. # 16
  31. # 10
  32. # function summ call 3
  33. # 16
  34. # функция декорирующая другую функцию
  35. def mydecorator(func): # функция принимающая декорируемую функцию
  36. def wrapper(*args): # функция запускаемая при вызове декоратора и принимающая аргументы декорируемой функции
  37. result = 1
  38. for x in args: # цикл для подсчета произведения чисел декорируемой функции
  39. result*=x
  40. print "multiply = %s" % result
  41. return func(*args) # запуск декорируемой функции
  42. return wrapper
  43. @mydecorator
  44. def summ(a,b,c):
  45. return a+b+c
  46. print summ(5,9,3)
  47. # multiply = 135
  48. # 17

В Python существует возможность передачи параметров самому декоратору, но для этого придется создать еще один слой обертывания.
  1. # decorator
  2. def is_man(is_man=False):
  3. def decorator(view):
  4. def wrapper(*args, **kwargs):
  5. print 'I man - ', is_man
  6. return view(*args, **kwargs)
  7. return wrapper
  8. return decorator
  9. @is_man(True)
  10. def my():
  11. pass
  12. my()
  13. # I man - True

Декораторы выполняются в порядке от внешнего к внутреннему. Последовательность выполнения в физическом мире напоминает разворачивание подарочной упаковки, слой за слоем...точно в такой последовательности выполняются декораторы.
  1. # Последовательность выполнения соответствует числовому индексу
  2. @decorator1
  3. @decorator2
  4. def main():
  5. pass

* Учебник про Python
  Всего: 1

Зарегистрируйтесь и сможете комментировать все темы. Кнопочка вверху
Фильтр по автору
Скачать тему

В Форум

Новые вверху
Statok.net Рейтинг@Mail.ru
spywap.nettop-sid.ru
Яндекс.Метрика