python 装饰器应用

装饰器应用:
装饰器的主要作用是:打印日志,检测性能,数据库事物,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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值