学设计模式中有个装饰模式,用java实现起来不是很难,但是远远没有python简单,难怪越来越火了!
这里就简单讨论下python的几种装饰模式:
一 无参装饰器:
# 装饰器 import time # 装饰器,记录函数运行时间 def decorator01(fun): def wapper(): stime = time.time() fun() etime = time.time() print("fun run time is {TIME}".format(TIME=etime - stime)) return wapper # 必须要返回一个函数的内存地址 # 使用装饰器装饰某个函数,等价于 test01=decorator01(test01), # 即将test01实际引用变成wapper函数内存地址,所以执行test01实际是执行wapper @decorator01 def test01(): time.sleep(2) print("test01 is running") test01() # 不修改代码和调用方式,实现添加记录时间功能
二 函数带参装饰器:
# 装饰器 import time # 装饰器,记录函数运行时间 def decorator01(fun): def wapper(*args, **kwargs): # 使用非固定参数,无论参数是什么,都可以传递进来 stime = time.time() fun(*args, **kwargs) etime = time.time() print("fun run time is {TIME}".format(TIME=etime - stime)) return wapper # 必须要返回一个函数的内存地址 # test01() = wapper(), 所以装饰器加参数是给嵌套函数加参数 @decorator01 def test01(args1): time.sleep(2) print("参数是 {NAME} ".format(NAME=args1)) test01("侯征") # 不修改代码和调用方式,实现添加记录时间功能
三 装饰器本身带参数的装饰器:
# 装饰器 import time # 如果装饰器有参数,最外层是装饰器的参数 def decorator01(*args, **kwargs): print("装饰器参数:", *args, **kwargs) def out(fun): #第二层才是接受的函数 def wapper(*args, **kwargs): # 使用非固定参数,无论参数是什么,都可以传递进来 stime = time.time() fun(*args, **kwargs) etime = time.time() print("fun run time is {TIME}".format(TIME=etime - stime)) return wapper # 必须要返回一个函数的内存地址 return out # 要返回装饰函数的内存地址 # 装饰器本身带参数,此时 decorator01(arg)=out,即相当于 @out装饰test01,所以 test01=out(fun)=wapper @decorator01(1) def test01(args1): time.sleep(2) print("参数是 {NAME} ".format(NAME=args1)) test01("侯征") # 不修改代码和调用方式,实现添加记录时间功能
这种一开始挺难理解的,但是只要记住一点,@语法糖装饰器的作用就是 给被装饰的函数重新赋一个函数的内存地址,即装饰器内部定义的那个
和你直接fun01=decorator(fun)
,然后 fun01()
是一样的,只是这样写不用改变原来调用方式
@decorator
def fun():
即就是 fun=decorator(fun)
所以,当装饰器有参数时,还需要返回一个函数,这个函数才是用来装饰作用的, decorator(1)=out
, 即 fun=out(fun)
!!
所以外面再包一层就行了,其实就相当于@decorator(1)=@out
,即 decorator(1)=out
,实际装饰器时out,只不过decorator(1)
返回了一个out 这样理解就简单多了 ,无参的@就是起赋值作用
以上就是python装饰器三种装饰模式的简单分析的详细内容,更多关于python 装饰模式的资料请关注其它相关文章!
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
白云城资源网 Copyright www.dyhadc.com
暂无“python装饰器三种装饰模式的简单分析”评论...
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
2024年12月24日
2024年12月24日
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]