位置: IT常识 - 正文

九步就可入门Python装饰器(九步功法)

编辑:rootadmin

推荐整理分享九步就可入门Python装饰器(九步功法),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:九步三招,九步功法,九步法是什么,九步舞一步一步教程,九步功法,九步三招,九步法是什么,九步法 百度网盘,内容如对您有帮助,希望把文章链接给更多的朋友!

第一步:最简单的函数,准备附加额外功能

#-*-coding:gbk-*-'''示例1:最简单的函数,表示调用了两次'''defmyfunc():print("myfunc()called.")myfunc()myfunc()

第二步:使用装饰函数在函数执行前和执行后分别附加额外功能

#-*-coding:gbk-*-'''示例2:替换函数(装饰)装饰函数的参数是被装饰的函数对象,返回原函数对象装饰的实质语句:myfunc=deco(myfunc)'''defdeco(func):print("beforemyfunc()called.")func()print("aftermyfunc()called.")returnfuncdefmyfunc():print("myfunc()called.")myfunc=deco(myfunc)myfunc()myfunc()

第三步:使用语法糖@来装饰函数

#-*-coding:gbk-*-'''示例3:使用语法糖@来装饰函数,相当于“myfunc=deco(myfunc)”但发现新函数只在第一次被调用,且原函数多调用了一次'''defdeco(func):print("beforemyfunc()called.")func()print("aftermyfunc()called.")returnfunc@decodefmyfunc():print("myfunc()called.")myfunc()myfunc()九步就可入门Python装饰器(九步功法)

相关推荐:《Python视频教程》

第四步:使用内嵌包装函数来确保每次新函数都被调用

#-*-coding:gbk-*-'''示例4:使用内嵌包装函数来确保每次新函数都被调用,内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象'''defdeco(func):def_deco():print("beforemyfunc()called.")func()print("aftermyfunc()called.")#不需要返回func,实际上应返回原函数的返回值return_deco@decodefmyfunc():print("myfunc()called.")return'ok'myfunc()myfunc()

第五步:对带参数的函数进行装饰

#-*-coding:gbk-*-'''示例5:对带参数的函数进行装饰,内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象'''defdeco(func):def_deco(a,b):print("beforemyfunc()called.")ret=func(a,b)print("aftermyfunc()called.result:%s"%ret)returnretreturn_deco@decodefmyfunc(a,b):print("myfunc(%s,%s)called."%(a,b))returna+bmyfunc(1,2)myfunc(3,4)

第六步:对参数数量不确定的函数进行装饰

#-*-coding:gbk-*-'''示例6:对参数数量不确定的函数进行装饰,参数用(*args,**kwargs),自动适应变参和命名参数'''defdeco(func):def_deco(*args,**kwargs):print("before%scalled."%func.__name__)ret=func(*args,**kwargs)print("after%scalled.result:%s"%(func.__name__,ret))returnretreturn_deco@decodefmyfunc(a,b):print("myfunc(%s,%s)called."%(a,b))returna+b@decodefmyfunc2(a,b,c):print("myfunc2(%s,%s,%s)called."%(a,b,c))returna+b+cmyfunc(1,2)myfunc(3,4)myfunc2(1,2,3)myfunc2(3,4,5)

第七步:让装饰器带参数

#-*-coding:gbk-*-'''示例7:在示例4的基础上,让装饰器带参数,和上一示例相比在外层多了一层包装。装饰函数名实际上应更有意义些'''defdeco(arg):def_deco(func):def__deco():print("before%scalled[%s]."%(func.__name__,arg))func()print("after%scalled[%s]."%(func.__name__,arg))return__decoreturn_deco@deco("mymodule")defmyfunc():print("myfunc()called.")@deco("module2")defmyfunc2():print("myfunc2()called.")myfunc()myfunc2()

第八步:让装饰器带类参数

#-*-coding:gbk-*-'''示例8:装饰器带类参数'''classlocker:def__init__(self):print("locker.__init__()shouldbenotcalled.")@staticmethoddefacquire():print("locker.acquire()called.(这是静态方法)")@staticmethoddefrelease():print("locker.release()called.(不需要对象实例)")defdeco(cls):'''cls必须实现acquire和release静态方法'''def_deco(func):def__deco():print("before%scalled[%s]."%(func.__name__,cls))cls.acquire()try:returnfunc()finally:cls.release()return__decoreturn_deco@deco(locker)defmyfunc():print("myfunc()called.")myfunc()myfunc()

第九步:装饰器带类参数,并分拆公共类到其他py文件中,同时演示了对一个函数应用多个装饰器。

#-*-coding:gbk-*-'''mylocker.py:公共类for示例9.py'''classmylocker:def__init__(self):print("mylocker.__init__()called.")@staticmethoddefacquire():print("mylocker.acquire()called.")@staticmethoddefunlock():print("mylocker.unlock()called.")classlockerex(mylocker):@staticmethoddefacquire():print("lockerex.acquire()called.")@staticmethoddefunlock():print("lockerex.unlock()called.")deflockhelper(cls):'''cls必须实现acquire和release静态方法'''def_deco(func):def__deco(*args,**kwargs):print("before%scalled."%func.__name__)cls.acquire()try:returnfunc(*args,**kwargs)finally:cls.unlock()return__decoreturn_deco#-*-coding:gbk-*-'''示例9:装饰器带类参数,并分拆公共类到其他py文件中同时演示了对一个函数应用多个装饰器'''frommylockerimport*classexample:@lockhelper(mylocker)defmyfunc(self):print("myfunc()called.")@lockhelper(mylocker)@lockhelper(lockerex)defmyfunc2(self,a,b):print("myfunc2()called.")returna+bif__name__=="__main__":a=example()a.myfunc()print(a.myfunc())print(a.myfunc2(1,2))print(a.myfunc2(3,4))

相关推荐:

本文链接地址:https://www.jiuchutong.com/zhishi/310694.html 转载请保留说明!

上一篇:python怎么传送文件(python文件间传递参数)

下一篇:php算法面试题有哪几种(php算法面试题有答案吗)

  • 一个工程中可以有多个主函数
  • 逆回购会不会亏本金
  • 建筑公司购入的水泥等材料如果是做成本的怎么做分录
  • 固定资产变卖怎么开票
  • 建筑企业预交的附加税怎么办
  • 视同销售但未收到钱怎么做账
  • 普通发票没有明细可以吗
  • 发票开错但已勾选还需要认证吗
  • 金税盘地区编号怎么查
  • 异地劳务分包要外经证吗
  • 买一赠一销售收入计算案例
  • 支持住房租赁市场金融新政
  • 股权转让溢价部分怎么做分录
  • 财务报告分析主要内容
  • 企业清算时未抵扣的进项税账务处理
  • 费用计提后冲减怎么做账
  • 损益调整是什么科目
  • 启用新账簿
  • 印刷专票税率是几个点
  • 增值税和增值税额的区别
  • 每股股份价格
  • 销售费用核算原则
  • 认缴实收资本印花税什么时候交
  • 城镇土地使用税的计税依据
  • 代缴社保工资怎么做账
  • 新办企业税务办理
  • 子公司能转让吗
  • 资本的不同形态
  • 个税申报已经扣了怎么办
  • 如何解决无线网络连接问题
  • 无线路由器1200m覆盖范围
  • 华为p30分屏怎么操作
  • php实现微信发红包的方法
  • 存货跌价后销售会计分录
  • 企业财务人员如何防范电信诈骗
  • 魅族路由器怎么样
  • laravel登录接口
  • 浅水滩怎么样
  • 增值税申报表上期留抵税额怎么填
  • 增值税减免附加税怎么处理
  • 金蝶怎么加人
  • Element UI - v-infinite-scroll无限滚动组件
  • 处置资产的账务处理
  • mktemp命令
  • 工业企业成本核算的一般程序包括下列的
  • 法人为什么不能领取失业金
  • 报税营业成本包括什么
  • python的协程
  • 自定义函数是啥
  • 企业所得税上个季度没报
  • 固定资产变卖怎么做账务处理
  • 非盈利组织接受劳务捐赠怎么入账
  • 资产评估机构可以评估土地吗
  • 结转以后年度抵免的境外所得税怎么进行会计处理
  • 2、开办费用计入哪个账户?
  • 营改增后不动产转让增值税
  • 子公司注销如何注销
  • 生产经营所得如何申请退税
  • 纳税调整收入包括哪些
  • 销售商品发生的销售退回属于期间费用吗
  • 如何算增值税金额
  • mysql %d
  • mysql备份与恢复数据库
  • Win10 PC/Mobile Creators快速预览版14959今日推送
  • 远程桌面连接没反应
  • solaris11.4安装教程
  • 进程crash是什么意思
  • win8分屏快捷键
  • mac上itunes
  • 进去界面黑屏
  • centos7命令行快捷键
  • 怎么判断进程是否存在
  • win7如何查看电脑主板型号
  • android开发流程
  • Android之Android apk动态加载机制的研究(二):资源加载和activity生命周期管理
  • linux批量修改文件时间
  • linux中wget命令出现错误
  • 山东省国家税务局威海培训中心
  • 首问责任制的概念
  • 销售佣金属于什么税目
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设