这里需要理解装饰器模式, 装饰者与被装饰者实现相同接口.

    1. import time
    2. def timer(func):
    3. def wrapper():
    4. start_time = time.time()
    5. func() # 调用
    6. stop_time = time.time()
    7. print('spend %s sec' % (stop_time-start_time))
    8. return wrapper()
    9. @timer # 将该函数传递给 timer 函数
    10. def i_can_sleep():
    11. # 模拟耗时操作
    12. time.sleep(3)
    13. # 输出
    14. spend 3.0012357234954834 sec
    • 带参数
    1. def tips(func):
    2. def nei(a, b):
    3. print('start')
    4. func(a, b)
    5. print('stop')
    6. return nei
    7. @tips
    8. def add(a, b):
    9. print(a+b)
    10. add(4, 5)
    11. # 输出
    12. start
    13. 9
    14. stop
    • 带参数的装饰器
    1. def new_tips(argv):
    2. print('argv:', argv)
    3. def tips(func):
    4. def nei(a, b):
    5. print('start, name: %s' % func.__name__)
    6. func(a, b)
    7. print('stop')
    8. return nei
    9. return tips
    10. # 带参数的装饰器, 猜测先把参数传递给 new_tips,
    11. # 然后根据参数来选择内部装饰器 (比如 tips),
    12. # 选好之后再把被装饰函数 (add) 传递给 tips.
    13. @new_tips('add_module')
    14. def add(a, b):
    15. print(a+b)
    16. add(4, 5)
    17. # 输出
    18. argv: add_module
    19. start, name: add
    20. 9
    21. stop