位置: IT常识 - 正文

python中的装饰器的使用实战

编辑:rootadmin

推荐整理分享python中的装饰器的使用实战,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

1、装饰器的理解

装饰器是将一个函数镶嵌在另一个函数中进行重复使用的目的,不改变其结构,增加函数的使用方式,但是不用写过多冗余的代码;

装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。

通常用到的功能:1.引入日志;2.函数执行时间统计;3.执行函数前预备处理;4.执行函数后清理功能;5.权限校验;6.缓存

2、实现原理与通用写法

咱们可以从一个简单的记录函数运行时间的简单装饰器,举一反三,推导出一个通用的装饰器写法

importtimedeftimer(func):'''记录方法运行时间的装饰器:paramfunc:方法:return:函数对象'''defdeco(*args,**kwargs):startTime=time.time()f=func(*args,**kwargs)endTime=time.time()msecs=(endTime-startTime)*1000print("timeis%dms"%msecs)returnf#如果func有返回值得话,需要在此return回去,否则,默认返回值为None,一般默认都返回returndeco@timerdeftest(parameter):print("testisrunning!")time.sleep(1)return"Returnedvalue"#该函数有返回值,所以需要在装饰器中的deco方法中写返回值t=test('aa')print(t)

这是一个很简单的通用的记录时间的装饰器,从而推导出一个通用的装饰器写法:

deffunc_name(func):#自定义装饰器函数名defdeco(*args,**kwargs):#将所有参数原封不动的进行传递print("在这个分割线之上写函数运行前的操作")#-----------分割线-----------f=func(*args,**kwargs)#-----------分割线-----------print("在这个分割线之后,return之前,写函数运行后的操作")returnf#如果func有返回值得话,需要在此return回去,否则,默认返回值为None,一般默认都返回returndeco@func_namedeftest(parameter):#8print("testisrunning!")time.sleep(1)return"Returnedvalue"#该函数有返回值,所以需要在装饰器中的deco方法中写返回值t=test('aa')print(t)

ok 装饰器到此可以完事了,一般情况下都能满足需求了,网上看那么多原理,有点儿浪费时间,我偏向实操型,实在不喜欢啰嗦那么多,就是干。

当然在开发过程中, 我们可能会遇到一些特殊情况,比如参数问题

python中的装饰器的使用实战

1、给装饰器函数代参数(通用)

2、将执行函数的参数拆分计算等(比如:1000w的数据,拆分成100份执行等)(定制)

那就按顺序来

1、写一个代参数的装饰器

deflogging(level):defwrapper(func):definner_wrapper(*args,**kwargs):print("[{level}]:enterfunction{func}()".format(level=level,func=func.__name__))returnfunc(*args,**kwargs)returninner_wrapperreturnwrapper@logging(level='INFO')defsay(something):print("say{}!".format(something))#如果没有使用@语法,等同于#say=logging(level='INFO')(say)@logging(level='DEBUG')defdo(something):print("do{}...".format(something))if__name__=='__main__':say('hello')do("mywork")

发现:就是在上面的通用的模板上又套了一层!!!,然后拿到里面的参数即可! so easy!!!

2、写一个参数拆分的装饰器,这个就稍微有点定制型了,不能像上面的一样通用了,举个 栗子:

deffunc_name(func):#自定义装饰器函数名defdeco(*args,**kwargs):#将所有参数原封不动的进行传递print(args[0])f_list=[]foriinrange(0,args[0],100000):print(i)f_list.append(func(i))#f_list#这儿应该按照既定规则,继续对这个结果进行拼接,如果是写文件、入库等操作,可以不用returnreturnf_list#这儿如果有返回值得话,应该是returndeco@func_namedeftest(parameter):#8print("testisrunning!")time.sleep(1)return"Returnedvalue"#该函数有返回值,所以需要在装饰器中的deco方法中写返回值t=test(1000000)print(t)

可以看出来,这个的定制性稍微高点,不通用,但是我们实现了我们的需求,所以,我们最应该理解并学会的是怎么用!!!

可以看出来,这个的定制性稍微高点,不通用,但是我们实现了我们的需求,所以,我们最应该理解并学会的是怎么用!!!

下面在介绍一下基于类实现的装饰器,那问题来了,我是实战派,我并没有用类装饰器的需求,所以,当个大盗吧,以后用到了不至于瞎找了!!!

装饰器函数其实是这样一个接口约束,它必须接受一个callable对象作为参数,然后返回一个callable对象。在Python中一般callable对象都是函数,但也有例外。只要某个对象重载了__call__()方法,那么这个对象就是callable的。

classTest():def__call__(self):print'callme!'t=Test()t()#callme

像__call__这样前后都带下划线的方法在Python中被称为内置方法,有时候也被称为魔法方法。重载这些魔法方法一般会改变对象的内部行为。上面这个例子就让一个类对象拥有了被调用的行为。

回到装饰器上的概念上来,装饰器要求接受一个callable对象,并返回一个callable对象(不太严谨,详见后文)。

那么用类来实现也是也可以的。我们可以让类的构造函数__init__()接受一个函数,然后重载__call__()并返回一个函数,也可以达到装饰器函数的效果。

classlogging(object):def__init__(self,func):self.func=funcdef__call__(self,*args,**kwargs):print"[DEBUG]:enterfunction{func}()".format(func=self.func.__name__)returnself.func(*args,**kwargs)@loggingdefsay(something):print"say{}!".format(something)

带参数的类装饰器

如果需要通过类形式实现带参数的装饰器,那么会比前面的例子稍微复杂一点。那么在构造函数里接受的就不是一个函数,而是传入的参数。通过类把这些参数保存起来。

classlogging(object):def__init__(self,level='INFO'):self.level=leveldef__call__(self,func):#接受函数defwrapper(*args,**kwargs):print"[{level}]:enterfunction{func}()".format(level=self.level,func=func.__name__)func(*args,**kwargs)returnwrapper#返回函数@logging(level='INFO')defsay(something):print"say{}!".format(something)
本文链接地址:https://www.jiuchutong.com/zhishi/310802.html 转载请保留说明!

上一篇:在dedecms织梦模板文章内容页调用关键词增加链接(如何用织梦在本地搭建网站)

下一篇:java同步的使用条件(java同步操作)

  • 苹果12pro如何开启来电闪光灯(苹果12pro如何开通volte)

    苹果12pro如何开启来电闪光灯(苹果12pro如何开通volte)

  • 华为mate30充电动画如何设置(华为mate305g充电)

    华为mate30充电动画如何设置(华为mate305g充电)

  • 苹果xsmax支持wifi6吗(苹果xsmax支持无线快充吗)

    苹果xsmax支持wifi6吗(苹果xsmax支持无线快充吗)

  • 视频导入pr后音画不同步(视频导入pr后音频变小)

    视频导入pr后音画不同步(视频导入pr后音频变小)

  • vivos1面部解锁在哪里(vivo手机面部识别设置)

    vivos1面部解锁在哪里(vivo手机面部识别设置)

  • 美图秀秀拍视频能拍多久(美图秀秀拍视频没保存怎么找回)

    美图秀秀拍视频能拍多久(美图秀秀拍视频没保存怎么找回)

  • 快手一天能评论多少条(买评论快手)

    快手一天能评论多少条(买评论快手)

  • 为什么wps分享出去和原版不一样(为什么wps分享出来的文件是链接)

    为什么wps分享出去和原版不一样(为什么wps分享出来的文件是链接)

  • 唯品会取消订单钱什么时候到账(唯品会取消订单后悔了怎么撤销退款)

    唯品会取消订单钱什么时候到账(唯品会取消订单后悔了怎么撤销退款)

  • 抖音极速版和抖音火山版有什么区别(抖音极速版和抖音互通吗)

    抖音极速版和抖音火山版有什么区别(抖音极速版和抖音互通吗)

  • 抖音封号里面的音浪怎么办(抖音封号里面的钱能提现吗)

    抖音封号里面的音浪怎么办(抖音封号里面的钱能提现吗)

  • 自拍怎么设置不是反的(自拍怎么设置不反转)

    自拍怎么设置不是反的(自拍怎么设置不反转)

  • 苹果iphonex防水吗(iphonex 防水)

    苹果iphonex防水吗(iphonex 防水)

  • 华为双卡一个卡没信号(华为双卡一个卡突然无服务)

    华为双卡一个卡没信号(华为双卡一个卡突然无服务)

  • oppoa11返回键怎么调出来(oppoa11返回键标识怎么设置)

    oppoa11返回键怎么调出来(oppoa11返回键标识怎么设置)

  • 计算机冷启动和热启动的区别(计算机冷启动和热启动的快捷键)

    计算机冷启动和热启动的区别(计算机冷启动和热启动的快捷键)

  • 1kb多少字节(1KB多少字节?)

    1kb多少字节(1KB多少字节?)

  • 小米手环资源库升级总失败怎么回事(小米手环资源库升级好吗)

    小米手环资源库升级总失败怎么回事(小米手环资源库升级好吗)

  • 华为手机是什么接口(华为手机是什么版本)

    华为手机是什么接口(华为手机是什么版本)

  • 多页面视图怎么取消(多页面视图怎么关闭)

    多页面视图怎么取消(多页面视图怎么关闭)

  • 拼多多账户在哪里(拼多多账户在哪里退出)

    拼多多账户在哪里(拼多多账户在哪里退出)

  • 新手学c还是java(新手学c还是java找工作)

    新手学c还是java(新手学c还是java找工作)

  • 超级看不能用了吗(超级看为什么不能用了)

    超级看不能用了吗(超级看为什么不能用了)

  • WPS怎么给字加下划线(wps中怎么给文字下面加点)

    WPS怎么给字加下划线(wps中怎么给文字下面加点)

  • 以avi为扩展名的文件通常是(以avi为扩展名的文件)

    以avi为扩展名的文件通常是(以avi为扩展名的文件)

  • 手机速度快慢和什么有关(手机快与慢什么有关)

    手机速度快慢和什么有关(手机快与慢什么有关)

  • WIN7安装.net framework提示错误代码0x800f0906(win7安装netframework4.5)

    WIN7安装.net framework提示错误代码0x800f0906(win7安装netframework4.5)

  • vue3+element-plus Dialog对话框的使用 与 setup 写法的使用

    vue3+element-plus Dialog对话框的使用 与 setup 写法的使用

  • 待抵扣进项税额转入进项税额
  • 高新技术企业享受15%税率优惠的条件
  • 无偿划转股份是好是坏
  • 个体工商户超过免税额度如何收税
  • 收到银行存兑汇票
  • 增值税纳税申报表在哪里打印
  • 营业执照备案登记流程
  • 税金及附加减半征收政策2022最新
  • 法人向公司账户汇款怎么做账
  • 衍生工具和非衍生工具怎么区分
  • 股息红利增值税和企业所得税
  • 商贸企业印花税税率
  • 生产成本存货会计分录
  • 已贴花的凭证凡修改后所载金额增加的部分应补贴印花
  • 购买办公用品并分发有关部门会计分录
  • 企业向个人借款的会计分录
  • 视同销售收入计入会计利润吗
  • 以银行存款支付水电费
  • 产品不合格造成客户损失怎么赔付
  • 个税手续费返还比例
  • 买车的保险可以砍价吗
  • 实际发生额大于账载金额
  • 水泥厂水泥增值税率是多少?
  • 再生资源税率多少合理
  • 车间扫帚存放架子
  • 审计的内容是什么
  • 个人独资企业查账征收个人所得税汇算清缴
  • 公司可以对公司罚款吗
  • 房产增值税包含个税吗
  • 付临时工工资计入什么科目
  • mac如何强制退出全屏
  • 无法连接到移动网络小米
  • 在php中使用什么获取文件的修改时间
  • 电脑qq聊天框变成一侧显示的软件版本
  • 文本模式是什么意思?
  • 服装制造业现状和发展趋势
  • 最好的ph计
  • 加计抵减是适用什么税率
  • yii框架官网
  • 税务申报说明怎么写范文
  • php微信公众号消息推送
  • 背景渐变 css
  • c++评测
  • 小规模纳税人征收方式
  • 新注册企业实收资本没到账怎么处理
  • 厂房转租会计分录
  • 沙箱支付宝app正式版
  • 固定资产的弃置费用
  • 非同一控制下的长期股权投资入账价值
  • 个体经营所得税核定征收2023税率
  • mysql触发器使用
  • 2021年购买土地需要缴纳什么税
  • 劳务发票税率最新标准
  • 过路费怎么抵扣进项税额报表怎么填
  • 纳税申报表多缴了怎么办
  • 职工教育经费调增
  • 现金日记账怎么划线
  • 公对公转账多久能到账
  • 清空mysql数据库
  • 以管理员的身份运行是什么意思win10
  • 怎样设置windows不更新
  • mac app store打开一片空白
  • mac怎么用浏览器
  • centos vmware
  • win8更新一直停着不动
  • ubuntu14打开终端
  • linux kill-15
  • Win10控制面板打不开
  • win7如何升级到win10有什么要求
  • linux 如何查看端口
  • js模拟登录网站
  • cocoscreator场景切换
  • extjs 为某个事件设置拦截器
  • javascript标题
  • django web开发
  • php操作dom
  • jquery技巧
  • jqurey+Jscex打造游戏力度条
  • javascript入门教程
  • js如何保留一位小数
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设