位置: 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同步操作)

  • 滴滴多少五星升一分(滴滴5星和4.9星)

    滴滴多少五星升一分(滴滴5星和4.9星)

  • 小米手环4蓝牙总断开(小米手环4蓝牙标志关闭)

    小米手环4蓝牙总断开(小米手环4蓝牙标志关闭)

  • 手机ag工艺是什么(ag工艺什么意思)

    手机ag工艺是什么(ag工艺什么意思)

  • 已连接到null是什么意思(null连接异常,请检查网络)

    已连接到null是什么意思(null连接异常,请检查网络)

  • xp支持内存多大内存

    xp支持内存多大内存

  • 美版苹果11和国行有什么区别(美版苹果11和国版苹果12的卡槽可以换的吗)

    美版苹果11和国行有什么区别(美版苹果11和国版苹果12的卡槽可以换的吗)

  • 把对方电话拉黑还能给对方打电话吗(把对方电话拉黑怎么操作)

    把对方电话拉黑还能给对方打电话吗(把对方电话拉黑怎么操作)

  • iqoo屏幕刷新率多少hz(iQOO屏幕刷新率选哪个好)

    iqoo屏幕刷新率多少hz(iQOO屏幕刷新率选哪个好)

  • 手机电量还有40怎么突然关机了(手机电量还有40突然就没电了)

    手机电量还有40怎么突然关机了(手机电量还有40突然就没电了)

  • 苹果手机半屏有什么用(iphone屏幕半屏)

    苹果手机半屏有什么用(iphone屏幕半屏)

  • qq语音时微信会忙音吗(qq语音时微信语音会显示什么)

    qq语音时微信会忙音吗(qq语音时微信语音会显示什么)

  • 联发科mt6765相当于骁龙多少(联发科mt6765相当于苹果几)

    联发科mt6765相当于骁龙多少(联发科mt6765相当于苹果几)

  • 美团接单必须要打印机吗(美团骑手一定要接单吗)

    美团接单必须要打印机吗(美团骑手一定要接单吗)

  • ipx5防水的实际意义(ipx5防水效果)

    ipx5防水的实际意义(ipx5防水效果)

  • p20pro充电器多少w(华为p20pro充电器多大功率)

    p20pro充电器多少w(华为p20pro充电器多大功率)

  • 怎么在快手直播唱歌(怎么在快手直播间播放电影视频)

    怎么在快手直播唱歌(怎么在快手直播间播放电影视频)

  • 快手长腿瘦身在哪找(快手里面的瘦腿魔法在哪里找)

    快手长腿瘦身在哪找(快手里面的瘦腿魔法在哪里找)

  • 呼叫转移怎么关闭(呼叫转移怎么关闭不了)

    呼叫转移怎么关闭(呼叫转移怎么关闭不了)

  • 苹果手机有没有接通震动(苹果手机有没有微信分身)

    苹果手机有没有接通震动(苹果手机有没有微信分身)

  • 苹果x能通话录音吗

    苹果x能通话录音吗

  • 卸载quik有什么影响(卸载软件安全吗)

    卸载quik有什么影响(卸载软件安全吗)

  • bmp是动画文件吗(bmp是动态图像还是静态)

    bmp是动画文件吗(bmp是动态图像还是静态)

  • 腾讯视频在哪投屏(腾讯视频投频)

    腾讯视频在哪投屏(腾讯视频投频)

  • 手机用充电宝充电越充越少(手机用充电宝充不上电是什么原因)

    手机用充电宝充电越充越少(手机用充电宝充不上电是什么原因)

  • 小程序报错:(“ errMsg “:“ navigateTo : fail can not  navigateTo a tabbar page “}(小程序报错怎么解决)

    小程序报错:(“ errMsg “:“ navigateTo : fail can not navigateTo a tabbar page “}(小程序报错怎么解决)

  • 金税四期怎么查账
  • 个体工商户的免税政策
  • 广东通用机打发票可以抵扣吗
  • 押金和租金
  • 季报业务活动表本月数
  • 入账价值 入账成本 入账金额
  • 餐饮注册个体工商户还是注册公司
  • 小规模纳税人未开票收入填在哪里
  • 新办企业一定要社保登记吗
  • 印花税退税流程怎么操作
  • 印花税是不是必须要交
  • 永续盘存制的含义
  • 抵账房好不好
  • 退税 增值税
  • 公司变卖后员工怎么办
  • 资产减值损失进利润表吗
  • 房产税的常见四大检查点
  • 房企行业其他应收账款的来源是什么
  • 一般纳税人销售旧货
  • 营养成分表的计算表
  • 现金分红和红利再投是什么意思
  • 保险企业准备金是什么
  • 延期申报出口退税流程
  • 资源综合利用企业税收优惠
  • 进出口免抵退税操作
  • macos升级报错
  • 劳务报酬必须要和工资申报吗
  • 购买财务软件申请怎么写
  • win 11怎么安装
  • 十分钟带你了解阿氏圆
  • PHP:is_writeable()的用法_Filesystem函数
  • 贷款损失准备的作用
  • 母公司收取子公司利润交增值税吗
  • 房地产开发企业分为几个等级
  • 报销加油票怎么开票
  • 《ai人工智能》
  • 炫酷登录注册教程
  • Apsara Clouder云计算技能认证
  • 企业之间的借款属于民间借贷吗
  • MongoDB aggregate 运用篇个人总结
  • 担保公司代偿会上征信嘛
  • 分公司产生的费用怎么报销
  • 收到红字发票如何入账
  • 增值税发票过了两个月怎么作废
  • 营改增之后发票的变化
  • 企业为员工承担个人部分的五险 一金可以税前扣除?
  • 归还股东借款要交税吗
  • 应纳税所得额计入什么科目
  • 银行汇票的特点和用途
  • 车船税是什么样子的?
  • 领用包装物用于包装产品的会计分录
  • 已认证的增值税专用发票退票
  • 其他业务支出可以在企业所得税前扣除吗
  • 筹建期的开办费开业后如何处理
  • 外购材料的核算方法有
  • 怎么冲减多计提的增值税
  • 已核销的坏账又收回时应当及时入账,防止形成账外款
  • 红酒礼品盒批发
  • 硬盘uefi启动安装系统
  • apache是什么文件
  • centos怎么样
  • 用win7的人多吗
  • rtmservice.exe - rtmservice是什么进程 有什么用
  • 图片如何添加到word文档
  • win7旗舰版系统激活密钥
  • 升级打装备的手游
  • android从服务器获取数据
  • 可序列化的类被标记为
  • linux反转
  • javascript数据类型有哪些
  • python编写飞机大战
  • linux bash命令详解
  • python函数参数的传递方法
  • python utils模块
  • 杭州二套房契税新政策2023年
  • 国家税务总局办税指南
  • 物业优质服务我们在行动
  • 小规模纳税人开专票需要交税吗
  • 浙江残保金征收标准
  • 服饰类关税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设