网页设计与网站开发的实践目的,wordpress进管理员,昌乐网站制作价格,互联网技术英文Python之装饰器-无参装饰器
装饰器介绍
1. 为何要用装饰器
Python 中的装饰器是一种语法糖#xff0c;可以在运行时#xff0c;动态的给函数或类添加功能。装饰器本质上是一个函数#xff0c;使用 函数名就是可实现绑定给函数的第二个功能 。将一些通用的、特定函数的功…Python之装饰器-无参装饰器
装饰器介绍
1. 为何要用装饰器
Python 中的装饰器是一种语法糖可以在运行时动态的给函数或类添加功能。装饰器本质上是一个函数使用 函数名就是可实现绑定给函数的第二个功能 。将一些通用的、特定函数的功能抽象成一个装饰器可以重复利用这些功能
2. 什么是装饰器
“装饰”代指为被装饰对象添加新的功能“器”代指器具/工具装饰器的作用就是在不修改被装饰对象源代码和调用方式的前提下为被装饰对象添加额外的功能。装饰器使用场景插入日志、性能测试、事务处理、缓存、权限校验可以调用的有函数、方法、类函数装饰器分为无参装饰器和有参装饰二者都是使用都是需要【名称空间函数嵌套闭包函数对象的组合知识】使用“”符号定义装饰器前提是需要有一个函数作为工具然后被“”装饰到其他函数头上为这个函数添加功能
无参装饰器
符号后是一个函数虽然是无参装饰器但是后的函数本质上是单参函数 def add(x, y):print(add.__name__, x, y)return x yadd(4, 5)# 此函数记录了调用了add函数x和y的值是什么
# 返回结果add 4 5
# 返回结果9import time # 时间底层模块
print(------)
time.sleep(10)
print(******)# 导入time模块执行第1个print后time.sleep(10) 休眠10秒然后输出第2个print
# 返回结果------
# 返回结果******import datetime # 导入datetime模块start datetime.datetime.now() # 设置start获取当前时间# 导入datetime模块end datetime.datetime.now() # 设置end,获取当前时间# end变量在下一个代码块中执行稍微等几秒错开时间。start, end # 记录的两个时间戳用于记录开始时间和结束时间
# 返回结果(datetime.datetime(2024, 3, 23, 11, 4, 2, 337816), datetime.datetime(2024, 3, 23, 11, 4, 4, 518772))(end - start).total_seconds() # total.seonds 总秒数# end 减去 start 获取运行的秒数
# 返回结果2.180956def add(x, y):#print(add.__name__, x, y) # 这个只能记录addsub呢#time.sleep(2) # 修秒2秒return x ydef logger(fn):ret fn(4, 5)return retlogger(add)# base版基于这版增加功能、
# 返回结果9def add(x, y):#print(add.__name__, x, y) # 这个只能记录addsub呢#time.sleep(2)return x ydef logger(fn, x, y):ret fn(x, y)return retlogger(add, 4, 5)# 返回结果9def add(x, y):#print(add.__name__, x, y) # 你这个只能记录addsub呢#time.sleep(2)return x ydef logger(fn, x, y):print(fn.__name__, x, y) # 增加记录值ret fn(x, y)return retlogger(add, 4, 5)# 返回结果add 4 5
# 返回结果9def add(x, y):#mylog(add.__name__, x, y) # 你这个只能记录addsub呢#time.sleep(2)return x ydef sub(x, y): # 可以用于多个函数return x - ydef logger(fn, x, y):print(fn.__name__, x, y) # 增加记录值ret fn(x, y)return retlogger(add, 4, 5)
logger(sub, 5, 6)# 返回结果add 4 5
# 返回结果sub 5 6
# 返回结果-1def add(x, y):#mylog(add.__name__, x, y) # 你这个只能记录addsub呢#time.sleep(2)return x ydef sub(x, y, z): # 可以用于多个函数return x - y - zdef logger(fn, *args, **kwargs): # 接受关键字传参位置传参。print(fn.__name__, args, kwargs) # 增加记录值print(执行前可以做的事情增强)ret fn(*args, **kwargs)print(执行后可以做的事情增强)return retlogger(add, 4, y8)
logger(sub, 5, 6, z7)# 返回结果add (4,) {y: 8}
# 返回结果执行前可以做的事情增强
# 返回结果执行后可以做的事情增强
# 返回结果sub (5, 6) {z: 7}
# 返回结果执行前可以做的事情增强
# 返回结果执行后可以做的事情增强
# 返回结果-8def add(x, y):#mylog(add.__name__, x, y) # 你这个只能记录addsub呢#time.sleep(2)return x ydef sub(x, y, z): # 可以用于多个函数return x - y - zdef logger(fn):def inner(*args, **kwargs):print(fn.__name__, args, kwargs) # 增加记录值print(执行前可以做的事情增强)ret fn(*args, **kwargs)print(执行后可以做的事情增强)return retreturn innerlogger(add)(4, y8)
#logger(sub, 5, 6, z7)# 返回结果add (4,) {y: 8}
# 返回结果执行前可以做的事情增强
# 返回结果执行后可以做的事情增强
# 返回结果12def add(x, y):#time.sleep(2)return x ydef sub(x, y, z): # 可以用于多个函数return x - y - zdef logger(fn):def inner(*args, **kwargs):print(执行前可以做的事情增强, fn.__name__, args, kwargs)ret fn(*args, **kwargs)print(执行后可以做的事情增强)return retreturn innerlogger(add)(4, y8)
#logger(sub, 5, 6, z7)# 返回结果执行前可以做的事情增强 add (4,) {y: 8}
# 返回结果执行后可以做的事情增强
# 返回结果12def add(x, y):#time.sleep(2)return x ydef sub(x, y, z): # 可以用于多个函数return x - y - zdef logger(fn): # fn adddef inner(*args, **kwargs):print(执行前可以做的事情增强, fn.__name__, args, kwargs)ret fn(*args, **kwargs) # fn(4, y8) add(4, y8)print(执行后可以做的事情增强)return retreturn innert logger(add) # t inner
print(t(4, y8)) # inner(4, y8)# 返回结果执行前可以做的事情增强 add (4,) {y: 8}
# 返回结果执行后可以做的事情增强
# 返回结果12def add(x, y):#time.sleep(2)return x ydef logger(fn): # fn adddef inner(*args, **kwargs):print(执行前可以做的事情增强, fn.__name__, args, kwargs)ret fn(*args, **kwargs) # fn(4, y8) add(4, y8)print(执行后可以做的事情增强)return retreturn inner#t logger(add) # t inner
#print(t(4, y8)) # inner(4, y8)add logger(add)
print(add(4, 5))# 返回结果执行前可以做的事情增强 add (4, 5) {}
# 返回结果执行后可以做的事情增强
# 返回结果9def add(x, y):#time.sleep(2)return x ydef logger(fn): # fn adddef inner(*args, **kwargs):print(执行前可以做的事情增强, fn.__name__, args, kwargs)ret fn(*args, **kwargs) # fn(4, y8) add(4, y8)print(执行后可以做的事情增强)return retreturn inner#t logger(add) # t inner
#print(t(4, y8)) # inner(4, y8)
print(hex(id(add))) # 打印add的id值
add logger(add)
print(add(4, 5))
print(add.__closure__) # 查看add的closure中记录闭包# 返回结果0x10954fd80
# 返回结果执行前可以做的事情增强 add (4, 5) {}
# 返回结果执行后可以做的事情增强
# 返回结果9
# 返回结果(cell at 0x1083e3d90: function object at 0x10954fd80,)def logger(fn): # fn adddef inner(*args, **kwargs):print(执行前可以做的事情增强, fn.__name__, args, kwargs)ret fn(*args, **kwargs) # fn(4, y8) add(4, y8)print(执行后可以做的事情增强)return retreturn innerlogger # 装饰器 #等价式 add logger(add) # logger应该等效为单参函数
def add(x, y):#time.sleep(2)return x y#t logger(add) # t inner
#print(t(4, y8)) # inner(4, y8)
#add logger(add)
print(add(4, 5))# 装饰器语法标识符把这一行下面一行的def定义的标识符作为其实参传入返回值覆盖了下面这个标识符
# 返回结果执行前可以做的事情增强 add (4, 5) {}
# 返回结果执行后可以做的事情增强
# 返回结果9def logger(fn): def inner(*args, **kwargs):print(执行前可以做的事情增强, fn.__name__, args, kwargs)ret fn(*args, **kwargs) print(执行后可以做的事情增强)return retreturn innerlogger # 装饰器 #等价式 add logger(add) # logger应该等效为单参函数
def add(x, y):#time.sleep(2)return x yprint(add(4, 5)) # 非侵入代码完成了功能并且好像从来没有装饰过一样
print(add.__name__) #add实际是inner# 返回结果执行前可以做的事情增强 add (4, 5) {}
# 返回结果执行后可以做的事情增强
# 返回结果9
# 返回结果innerdef logger(wrapped): def wrapper(*args, **kwargs):print(执行前可以做的事情增强, wrapped.__name__, args, kwargs)ret wrapped(*args, **kwargs) print(执行后可以做的事情增强)return retreturn wrapperlogger # 装饰器 #等价式 add logger(add) # logger应该等效为单参函数
def add(x, y):#time.sleep(2)return x yprint(add(4, 5)) # 非侵入代码完成了功能并且好像从来没有装饰过一样
print(add.__name__)# 返回结果执行前可以做的事情增强 add (4, 5) {}
# 返回结果执行后可以做的事情增强
# 返回结果9
# 返回结果wrapperdef logger(wrapped): def wrapper(*args, **kwargs):start datetime.datetime.now()ret wrapped(*args, **kwargs) delta (datetime.datetime.now() - start).total_seconds()print({} tooks {}s..format(wrapped.__name__, delta))return retreturn wrapperlogger # 装饰器 #等价式 add logger(add) # logger应该等效为单参函数
def add(x, y):time.sleep(2)return x yprint(add(4, 5)) # 非侵入代码完成了功能并且好像从来没有装饰过一样
print(add.__name__) # 返回结果add tooks 2.002051s.
# 返回结果9
# 返回结果wrapper
文章转载自: http://www.morning.mwqbp.cn.gov.cn.mwqbp.cn http://www.morning.qlckc.cn.gov.cn.qlckc.cn http://www.morning.yccnj.cn.gov.cn.yccnj.cn http://www.morning.xqzrg.cn.gov.cn.xqzrg.cn http://www.morning.newfeiya.com.cn.gov.cn.newfeiya.com.cn http://www.morning.whclz.cn.gov.cn.whclz.cn http://www.morning.lgkbn.cn.gov.cn.lgkbn.cn http://www.morning.qnbgh.cn.gov.cn.qnbgh.cn http://www.morning.yrkdq.cn.gov.cn.yrkdq.cn http://www.morning.fkgqn.cn.gov.cn.fkgqn.cn http://www.morning.nnhfz.cn.gov.cn.nnhfz.cn http://www.morning.hxftm.cn.gov.cn.hxftm.cn http://www.morning.fqyxb.cn.gov.cn.fqyxb.cn http://www.morning.nmymn.cn.gov.cn.nmymn.cn http://www.morning.xknmn.cn.gov.cn.xknmn.cn http://www.morning.dybth.cn.gov.cn.dybth.cn http://www.morning.yhjlg.cn.gov.cn.yhjlg.cn http://www.morning.sjpbh.cn.gov.cn.sjpbh.cn http://www.morning.brld.cn.gov.cn.brld.cn http://www.morning.ttkns.cn.gov.cn.ttkns.cn http://www.morning.sqyjh.cn.gov.cn.sqyjh.cn http://www.morning.sloxdub.cn.gov.cn.sloxdub.cn http://www.morning.hxrfb.cn.gov.cn.hxrfb.cn http://www.morning.xjkr.cn.gov.cn.xjkr.cn http://www.morning.ydhmt.cn.gov.cn.ydhmt.cn http://www.morning.hrgxk.cn.gov.cn.hrgxk.cn http://www.morning.tmnyj.cn.gov.cn.tmnyj.cn http://www.morning.zrnph.cn.gov.cn.zrnph.cn http://www.morning.bctr.cn.gov.cn.bctr.cn http://www.morning.rwzkp.cn.gov.cn.rwzkp.cn http://www.morning.ndnhf.cn.gov.cn.ndnhf.cn http://www.morning.gkjyg.cn.gov.cn.gkjyg.cn http://www.morning.wplbs.cn.gov.cn.wplbs.cn http://www.morning.jkzq.cn.gov.cn.jkzq.cn http://www.morning.ccpnz.cn.gov.cn.ccpnz.cn http://www.morning.c7493.cn.gov.cn.c7493.cn http://www.morning.smdiaosu.com.gov.cn.smdiaosu.com http://www.morning.dgfpp.cn.gov.cn.dgfpp.cn http://www.morning.jpfpc.cn.gov.cn.jpfpc.cn http://www.morning.dygsz.cn.gov.cn.dygsz.cn http://www.morning.ygflz.cn.gov.cn.ygflz.cn http://www.morning.qlrtd.cn.gov.cn.qlrtd.cn http://www.morning.rfrxt.cn.gov.cn.rfrxt.cn http://www.morning.qzzmc.cn.gov.cn.qzzmc.cn http://www.morning.jsdntd.com.gov.cn.jsdntd.com http://www.morning.ltffk.cn.gov.cn.ltffk.cn http://www.morning.rmxgk.cn.gov.cn.rmxgk.cn http://www.morning.rnrfs.cn.gov.cn.rnrfs.cn http://www.morning.trqzk.cn.gov.cn.trqzk.cn http://www.morning.rhsg.cn.gov.cn.rhsg.cn http://www.morning.kjfqf.cn.gov.cn.kjfqf.cn http://www.morning.bhrbr.cn.gov.cn.bhrbr.cn http://www.morning.fnpyk.cn.gov.cn.fnpyk.cn http://www.morning.yjknk.cn.gov.cn.yjknk.cn http://www.morning.gmrxh.cn.gov.cn.gmrxh.cn http://www.morning.zwyuan.com.gov.cn.zwyuan.com http://www.morning.qkkmd.cn.gov.cn.qkkmd.cn http://www.morning.qsdnt.cn.gov.cn.qsdnt.cn http://www.morning.mbfj.cn.gov.cn.mbfj.cn http://www.morning.lrskd.cn.gov.cn.lrskd.cn http://www.morning.jcyyh.cn.gov.cn.jcyyh.cn http://www.morning.fcqlt.cn.gov.cn.fcqlt.cn http://www.morning.jkwwm.cn.gov.cn.jkwwm.cn http://www.morning.znnsk.cn.gov.cn.znnsk.cn http://www.morning.xkbdx.cn.gov.cn.xkbdx.cn http://www.morning.twwzk.cn.gov.cn.twwzk.cn http://www.morning.bchhr.cn.gov.cn.bchhr.cn http://www.morning.srgnd.cn.gov.cn.srgnd.cn http://www.morning.wqhlj.cn.gov.cn.wqhlj.cn http://www.morning.uqrphxm.cn.gov.cn.uqrphxm.cn http://www.morning.slzkq.cn.gov.cn.slzkq.cn http://www.morning.gassnw.com.gov.cn.gassnw.com http://www.morning.fbnsx.cn.gov.cn.fbnsx.cn http://www.morning.pgfkl.cn.gov.cn.pgfkl.cn http://www.morning.spdyl.cn.gov.cn.spdyl.cn http://www.morning.hqrr.cn.gov.cn.hqrr.cn http://www.morning.rnygs.cn.gov.cn.rnygs.cn http://www.morning.jcrlx.cn.gov.cn.jcrlx.cn http://www.morning.rsbqq.cn.gov.cn.rsbqq.cn http://www.morning.shuanga.com.cn.gov.cn.shuanga.com.cn