Python装饰器高级用法
在 Python 中, 装饰器 一般用来修饰函数,实现公共功能,达到代码复用的目的。在函数定义前加上 @xxxx ,然后函数就注入了某些行为,很神奇!然而,这只是 语法糖 而已。 场景 假设,有一些工作函数,用来对数据做不同的处理: def work_bar(data): pass def work_foo(data): pass 我们想在函数调用前/后输出日志,怎么办? 傻瓜解法 logging.info('begin call work_bar') work_bar(1) logging.info('call work_bar done') 如果有多处代码调用呢?想想就怕! 函数包装 傻瓜解法无非是有太多代码冗余,每次函数调用都要写一遍 logging 。可以把这部分冗余逻辑封装到一个新函数里: def smart_work_bar(data): logging.info('begin call: work_bar') work_bar(data) logging.info('call doen: work_bar') 这样,每次调用 smart_work_bar 即可: smart_work_bar(1) # ... smart_work_bar(some_data) 通用闭包 看上去挺完美……然而,当 work_foo 也有同样的需要时,还要再实现一遍 smart_work