decorator_1.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. from functools import wraps
  2. '''
  3. Этот декоратор демонстрирует способ сохранить данные
  4. об исходной функции
  5. def table(func):
  6. def inner(*args, **kwargs):
  7. print('<table>')
  8. func(*args, **kwargs)
  9. print('</table>')
  10. inner.__name__ = func.__name__
  11. inner.__doc__ = func.__name__
  12. inner.__annotations__ = func.__annotations__
  13. return inner
  14. '''
  15. """
  16. Это другой способ сохранить данные об исходной функции
  17. """
  18. def table(func):
  19. @wraps(func)
  20. def inner(*args, **kwargs):
  21. print('<table>')
  22. func(*args, **kwargs)
  23. print('</table>')
  24. return inner
  25. @table
  26. def print_sqr_number(x: int) -> None:
  27. """
  28. Печатает квадрат числа x
  29. :param x
  30. :retrun: None
  31. """
  32. print(x ** 2)
  33. '''
  34. @table
  35. def say_hello(name: str, surname: str) -> None:
  36. """Функция приветствует человека"""
  37. print("Hello", name, surname)
  38. '''
  39. @table
  40. def say_bye(name):
  41. print('Hello', name)
  42. def dec(fn):
  43. print("Запуск декоратора")
  44. def wrapper(*args, **kwargs):
  45. print("Запуск inner")
  46. return fn(*args, **kwargs)
  47. return wrapper
  48. @dec
  49. def say_hello() -> None:
  50. return 'Hello'
  51. def main():
  52. '''
  53. print(f'{say_hello.__name__ = }')
  54. print(f'{say_hello.__doc__ = }')
  55. print(f'{say_hello.__annotations__ = }')
  56. print(f'{say_hello.__name__ = }')
  57. print(f'{say_bye.__name__ = }')
  58. '''
  59. '''
  60. print(f'{print_sqr_number.__name__ = }')
  61. print(f'{print_sqr_number.__doc__ = }')
  62. print(f'{print_sqr_number.__annotations__ = }')
  63. print_sqr_number(6)
  64. '''
  65. print(say_hello())
  66. print(say_hello())
  67. if __name__ == '__main__':
  68. main()