装饰器应用:
装饰器的主要作用是:打印日志,检测性能,数据库事物,url路由
应用1,生成标签
def Bold(fn):
def wrapped():# 闭包,这个函数的作用就是给原来的函数增加一些功能,
return "<b>" + fn() + "</b>"
return wrapped# 返回的是闭包,然后再把这个新的函数的名字赋值成原来的函数名
@Bold
def test():
return "python"
In [2]: test()
Out[2]: '<b>python</b>'
等价于
def wrapped(test):# 参数以后会是一个函数
return "<b>" + test() + "</b>" # 参数实际上是一个函数
def test():
return "python"
# 从这里看出,装饰器最外面的函数只是为了最后函数更改名称的方便,就是把wrapped()名字改成过了test()名字
In [2]: wrapped(test)
Out[2]: '<b>python</b>'
应用2 日志函数
In[2]: def log(f):
...: def wr(*args, **kwargs):
...: print(f'call {f.__name__}() ')
...: return f(*args, **kwargs)
...: return wr
...: @log
...: def test():
...: pass
...: test()
...:
call test()
应用3 函数性能检测
In[2]: import time
...: def perf(f):
...: def wr(*args, **kwargs):
...: start = time.time()
...: f(*args, **kwargs)
...: end = time.time()
...: print(f'call {f.__name__}() in {end - start}')
...: return wr
...:
...: @perf
...: def test(x):
...: time.sleep(2)
...: test(3)
...:
call test() in 2.0124034881591797
应用4 连接数据库
def link_mysql(fun):
def wr(*args, **kwargs):
with pymysql.connect(host=host, port=port, user=user, passwd=passwd, db=dbname, charset=charset) as cur:
fun(cur, *args, **kwargs)
return wr
@link_mysql
def insert_data(cur, ...):
应用5 url
url_map = {
'/index': index
}
def route(option): # {'k1':'v1'}
def inner(func,*args, **kwargs):
url_map[option['path']] = func
return inner
#inner = wrapper({'k1':'v1'})
#@inner --> inner(index)
@route({'path':'/index'})
def index(request):
pass
参考文献:
https://www.cnblogs.com/yuzhanhong/p/9180212.html
https://zhuanlan.zhihu.com/p/35219750