装饰器
什么是装饰器
装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。
装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景。
装饰器的形成过程
import time def func1(): print("in func1") def timer(func): def inner(): start = time.time() func() print(time.time() - start) return inner func1 = timer(func1) func1()
每次执行func1 = timer(func1)会很麻烦,python提供了一个简单的方法:语法糖。
import time def timer(func): def inner(): start = time.time() func() print(time.time() - start) return inner @timer # --> func1 = timer(func1) def func1(): print("in func1") func1()
带参数的装饰器
import time def timer(func): def inner(a): start = time.time() func(a) print(time.time() - start) return inner @timer def func1(a): print(a) func1()
import time def timer(func): def inner(*args, **kwargs): start = time.time() re = func(*args, **kwargs) print(time.time() - start) return re return inner @timer def func1(a, b): print("in func1") @timer def func2(a): print("in func2 and get a:%s" % a) return "func2 over" func1("aaaaaa", "bbbbbb") print(func2("aaaaaa"))
查看函数信息的方法:
from functools import wraps def deco(func): @wraps(func) # 加在最内层函数正上方 def wrapper(*args, **kwargs): return func(*args, **kwargs) return wrapper @deco def index(): """哈哈哈哈""" print("from index") print(index.__doc__) print(index.__name__)
开放封闭原则
1.对扩展是开放的
2.对修改时封闭的
装饰器的主要功能和固定结构
def timer(func): def inner(*args, **kwargs): """执行函数之前要做的""" re = func(*args, **kwargs) """执行函数之后要做的""" return re return inner from functools import wraps def deco(func): @wraps(func) def wrapper(*args, **kwargs): return func(*args, **kwargs) return wrapper
如何去掉装饰器
def outer(flag): def timer(func): def inner(*args, **kwargs): """执行函数之前要做的""" re = func(*args, **kwargs) """执行函数之后要做的""" return re return inner return timer @outer(False) def func(): print(111) func()
多个装饰器装饰一个函数
def wrapper1(func): def inner(): print("wrapper1, before func") func() print("wrapper1, after func") return inner def wrapper2(func): def inner(): print("wrapper2, before func") func() print("wrapper2, after func") return inner @wrapper2 @wrapper1 def f(): print("in f") f()