装饰器的思想
装饰器是建立在Python中函数可以作为参数传递和返回的基础上,作用是对函数的功能和行为做扩充和延展,但是这个过程不会修改原函数的逻辑,所以叫装饰而不是修改。
装饰器的基本实现逻辑:
- 传入目标函数(func)
- 创建新函数(Wrapper)
- 在Wrapper中执行func同时添加扩展功能
- 返回新函数Wrapper
从逻辑中我们看出,装饰器的行为是用一个扩充过功能的新函数替换原函数,这个过程是在代码加载中完成的,被装饰过的函数实际上已经是装饰器返回的的新函数了。
由于装饰器返回的新函数中元数据已经发生了变化,为了保持新函数元数据和旧函数相同,可以使用@functools.wraps(f)装饰新函数Wrapper。
装饰器举例
1. 不带参数的装饰器
def decorator(f): @functools.wraps(f) def wrapper(*args, **kwargs): print("decorator without param") return f(*args, **kwargs) return wrapper@decoratordef func(word): print("word is: " + word)
@decorator是python语法糖,语法糖就是换一种方式执行既定的功能,@decorator等同于func = decorator(func)
2. 带参数的装饰器
def route(rule): def decorator(f): @functools.wraps(f) def wrapper(*args, **kwargs): print(rule) print("decorator with params") return f(*args, **kwargs) return wrapper return decorator@route('/app')def func(word): print("word is: " + word)
@route('/app')等同于func = route('/app')(func)