1. def logger(func):
    2. def wrapper():
    3. print('logging execution')
    4. func()
    5. print('Done logging')
    6. return wrapper
    7. @logger
    8. def sample():
    9. print('-- Inside sample function')
    10. sample()
    11. #结果
    12. logging execution
    13. -- Inside sample function
    14. Done logging

    简述:

    1. #funA 作为装饰器函数
    2. def funA(fn):
    3. ...
    4. fn() # 执行传入的fn参数
    5. ...
    6. return '...'
    7. @funA
    8. def funB():
    9. ...
    10. 实际上,上面程序完全等价于下面的程序:
    11. def funA(fn):
    12. ...
    13. fn() # 执行传入的fn参数
    14. ...
    15. return '...'
    16. def funB():
    17. ...
    18. funB = funA(funB)
    19. 通过比对以上 2 段程序不难发现,使用函数装饰器 A() 去装饰另一个函数 B(),其底层执行了如下 2 步操作:
    20. B 作为参数传给 A() 函数;
    21. A() 函数执行完成的返回值反馈回 B