装饰器.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. # -*- coding: UTF-8 -*-
  2. ###============ 装饰器的最简单用法 ============###
  3. # n = 'hello'
  4. # def outer(arg):
  5. # def inner():
  6. # print(arg.upper())
  7. # return inner
  8. # n = outer(n)
  9. # n()
  10. ###============ 装饰器的修饰 ============###
  11. def n():
  12. print("徐大虫!")
  13. # 不改变原有函数的情况下增加新的功能
  14. # 如下的 n()。
  15. def outer(arg):
  16. def inner():
  17. print("*" * 30) # 新增功能
  18. arg()
  19. print("*" * 30) # 上下都可新增功能
  20. return inner
  21. n = outer(n) # python 封装为 @ 。如下:
  22. n()
  23. ###============ Python装饰器 @ ============###
  24. # def outer(arg):
  25. # def inner():
  26. # print("*" * 30)
  27. # arg()
  28. # print("*" * 30)
  29. # return inner
  30. # @outer #作用相当于 n = outer(n); 下面紧跟函数。
  31. # def n():
  32. # print("徐大虫!")
  33. # n()
  34. ###============ wraps 保留原来的函数名称及属性 ============###
  35. import functools
  36. def my_decorator(func):
  37. @functools.wraps(func)
  38. def wrapper(*args, **kwargs):
  39. '''decorator'''
  40. print('Calling decorated function...')
  41. return func(*args, **kwargs)
  42. return wrapper
  43. @my_decorator
  44. def example():
  45. """Docstring"""
  46. print('Called example function')
  47. # print(example())
  48. print(example.__name__, example.__doc__)