dec.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. # -*- coding: utf-8 -*-
  2. # def my_decorator(function_to_decorate):
  3. # def the_wrapper_around_the_original_function():
  4. # print("Этот код работает до вызова функции")
  5. # function_to_decorate()
  6. # print("Этот код работает после вызова функции")
  7. # return the_wrapper_around_the_original_function
  8. # def stand_alone_function():
  9. # print("Эта функция не изменяется")
  10. # @my_decorator
  11. # def another_stand_alone_function():
  12. # print("Оставль меня в покое")
  13. # another_stand_alone_function()
  14. #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  15. # Передача аргументов в декорируемую функцию
  16. def a_decorator_passing_argument(function_to_decorate):
  17. def a_wrapper_accepting_arguments(arg1, arg2):
  18. print "Смотри, что я получил:", arg1, arg2
  19. function_to_decorate(arg1, arg2)
  20. return a_wrapper_accepting_arguments
  21. @a_decorator_passing_argument
  22. def print_full_name(first_name, last_name):
  23. print "Меня зовут", first_name, last_name
  24. # print_full_name("Питер", "Венкман")
  25. #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  26. # Декорирование методов
  27. def method_friendly_decorator(method_to_decorate):
  28. def wrapper(self, lie):
  29. return method_to_decorate(self, lie)
  30. return wrapper
  31. class Lucy(object):
  32. def __init__(self):
  33. self.age = 21
  34. @method_friendly_decorator
  35. def sayYourAge(self, lie):
  36. print 'Мне %s, а ты бы сколько дал?' % (self.age + lie)
  37. # l = Lucy()
  38. # l.sayYourAge(-3)
  39. #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  40. def a_decorator_passing_arbitrary_arguments(function_to_decorate):
  41. def a_wrapper_accepting_arbitrary_arguments(*args, **kwargs):
  42. print "Передали ли мне что-нибудь?:"
  43. print args
  44. print kwargs
  45. function_to_decorate(*args, **kwargs)
  46. return a_wrapper_accepting_arbitrary_arguments
  47. @a_decorator_passing_arbitrary_arguments
  48. def function_with_no_argument():
  49. print "No argument here"
  50. # function_with_no_argument()
  51. @a_decorator_passing_arbitrary_arguments
  52. def function_with_arguments(a, b, c):
  53. print a, b, c
  54. # function_with_arguments(1, 2, 3)
  55. @a_decorator_passing_arbitrary_arguments
  56. def function_with_named_arguments(a, b, c, platypus="Почему нет?"):
  57. print "Любят ли %s, %s и %s утконосов? %s" % (a, b, c, platypus)
  58. # function_with_named_arguments("Билл", "Линус", "Стив", platypus="Определенно!")
  59. class Mary(object):
  60. def __init__(self):
  61. self.age = 31
  62. @a_decorator_passing_arbitrary_arguments
  63. def sayYourAge(self, lie=-3):
  64. print 'Мне %s, а ты бы сколько дал?' % (self.age + lie)
  65. # m = Mary()
  66. # m.sayYourAge()
  67. #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  68. def decorator_maker_with_arguments(decorator_arg1, decorator_arg2):
  69. print "Я создаю декораторы! И я получил следующие аргументы:", decorator_arg1, decorator_arg2
  70. def my_decorator(func):
  71. print "Я - декоратор. И ты все же смог передать мне эти аргументы:", decorator_arg1, decorator_arg2
  72. def wrapped(function_arg1, function_arg2):
  73. print ("Я - обёртка вокруг декорируемой функции.\n"
  74. "И я имею доступ ко всем аргументам: \n"
  75. "\t- и декоратора: {0} {1}\n"
  76. "\t- и функции: {2} {3}\n"
  77. "Теперь я могу передать нужные аргументы дальше"
  78. .format(decorator_arg1, decorator_arg2, function_arg1, function_arg2))
  79. return func(function_arg1, function_arg2)
  80. return wrapped
  81. return my_decorator
  82. @decorator_maker_with_arguments("Леонард", "Шелдон")
  83. def decorated_function_with_arguments(function_arg1, function_arg2):
  84. print ("Я - декорируемая функция и я знаю только о своих аргументах: {0}"
  85. " {1}".format(function_arg1, function_arg2))
  86. decorated_function_with_arguments("Раджеш", "Говард")