位置: 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算法面试题有答案吗)

  • 以土地投资入股是否需要缴纳增值税
  • 销项税额和进项税额发票怎么区别
  • 股权变更后税务需要变更吗
  • 民办非企业单位可以盈利吗
  • 缴纳的增值税在资产负债表中怎么体现
  • 本期应纳税额减征额怎么填写
  • 已付的账款叫什么
  • 单用途卡与多用途卡
  • 利润表中的本期金额栏内各项数字一般根据什么填列
  • 出售简易征收的固定资产的增值税怎么计算
  • 生产车间领用低值易耗品
  • 一般纳税人临时工工资怎么入账
  • 商贸企业变更为生产企业
  • 预收账款年底要确认收入吗
  • 实收资本未实缴到位,是否缴纳印花税
  • 公司收到法院的欠款起诉书,应该怎么办
  • 企业多缴纳所得税怎么办
  • 进货费用会计科目
  • 外籍员工缴纳商业保险
  • 出口企业是外贸企业吗
  • 营改增后租金如何交税
  • 筹建期间职工福利费都要通过应付职工薪酬核算吗
  • 分工分类法
  • 小汽车的消费税征税环节
  • 失控发票不处理的后果
  • 增值税和增值税额的区别
  • 其他收益科目核算
  • 华为matex3爆料
  • 怎么访问海康硬盘录像机
  • 各类预算的内容及其相互关系
  • 小米手环2支持nfc功能?
  • win11安装失败0xc1900201
  • php抽奖算法程序怎么写
  • 公司入股的钱怎么做账
  • 餐饮发票可以计入什么费用
  • 百香果的功效与作用及食用方法果的籽能嚼碎吃吗?
  • 员工的收入
  • 结算备付金管理办法(2019年修订版)
  • 阿查法拉亚盆地牡蛎
  • laravel create
  • thinkphp smarty
  • 融资租赁利息资本化条件
  • vue运行报错怎么解决
  • 基于Java+SpringBoot+Vue+uniapp微信小程序零食商城系统设计和实现
  • 交易性金融资产的入账价值
  • 深度学习知识点简单概述【更新中】
  • git web hook
  • 原始凭证必要时可以涂改
  • 无偿划转的资产交什么税收
  • 销售费用处理不包括哪些
  • mysql 索引类型以及使用场景
  • sql server数字类型
  • 进项税额转出忘记申报咋办
  • 租金收入如何确认收入
  • 租赁个人房屋租金怎么算
  • 支付境外货款需要缴纳哪些税费
  • 暂估入库的商品能出库吗
  • 建筑行业收到工程款延期付款利息需不需要开票
  • 地税报表如何填写
  • 公益捐赠仪式流程
  • 房地产开发企业增值税税率
  • 一个关于数据库表中的各条记录
  • mysql使用正则表达式查询数据并另存为另一列
  • MySQL使用show status查看MySQL服务器状态信息
  • ubuntu磁盘空间突然满了
  • windows2003设置自动重启
  • mac虚拟机安装win10教程
  • 深度u盘装xp系统教程
  • mac浏览器显示不全
  • winadslave.exe - winadslave是什么进程
  • win10系统怎么回滚
  • win8无法安装net4.7
  • win8怎么设置开机启动项
  • node.js gui
  • python res.
  • 国税局发票查验平台查询不到
  • 十九届三中全会主题
  • 冻结银行账户属于什么
  • 河南省注册税务师协会电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设