example09.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. """
  2. 装饰器 - 装饰器中放置的通常都是横切关注(cross-concern)功能
  3. 所谓横切关注功能就是很多地方都会用到但跟正常业务又逻辑没有必然联系的功能
  4. 装饰器实际上是实现了设计模式中的代理模式 - AOP(面向切面编程)
  5. """
  6. from functools import wraps
  7. from random import randint
  8. from time import time, sleep
  9. import pymysql
  10. def record(output):
  11. def decorate(func):
  12. @wraps(func)
  13. def wrapper(*args, **kwargs):
  14. start = time()
  15. ret_value = func(*args, **kwargs)
  16. output(func.__name__, time() - start)
  17. return ret_value
  18. return wrapper
  19. return decorate
  20. def output_to_console(fname, duration):
  21. print('%s: %.3f秒' % (fname, duration))
  22. def output_to_file(fname, duration):
  23. with open('log.txt', 'a') as file_stream:
  24. file_stream.write('%s: %.3f秒\n' % (fname, duration))
  25. def output_to_db(fname, duration):
  26. con = pymysql.connect(host='localhost', port=3306,
  27. database='test', charset='utf8',
  28. user='root', password='123456',
  29. autocommit=True)
  30. try:
  31. with con.cursor() as cursor:
  32. cursor.execute('insert into tb_record values (default, %s, %s)',
  33. (fname, '%.3f' % duration))
  34. finally:
  35. con.close()
  36. @record(output_to_console)
  37. def random_delay(min, max):
  38. sleep(randint(min, max))
  39. def main():
  40. for _ in range(3):
  41. # print(random_delay.__name__)
  42. random_delay(3, 5)
  43. # for _ in range(3):
  44. # # 取消掉装饰器
  45. # random_delay.__wrapped__(3, 5)
  46. if __name__ == '__main__':
  47. main()