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

  • 美团尊享会员红包购买方式是什么(美团会员尊享会员抵扣红包)

    美团尊享会员红包购买方式是什么(美团会员尊享会员抵扣红包)

  • OPPOA83怎样备份(oppoa11如何备份)

    OPPOA83怎样备份(oppoa11如何备份)

  • word系统中输入文档时按enter键后将产生什么符号(文档的输入)

    word系统中输入文档时按enter键后将产生什么符号(文档的输入)

  • ios快捷指令安全性设置不允许(iphone快捷指令安全性设置无法打开)

    ios快捷指令安全性设置不允许(iphone快捷指令安全性设置无法打开)

  • 华为账号哪里查看(从哪里查看华为账号)

    华为账号哪里查看(从哪里查看华为账号)

  • 微信可以发几分钟的视频(微信可以发几分钟的朋友圈)

    微信可以发几分钟的视频(微信可以发几分钟的朋友圈)

  • 下载并使用网易论坛APP怎么完成?(下载网易网页)

    下载并使用网易论坛APP怎么完成?(下载网易网页)

  • 小米平板4能打电话吗(小米平板4能打电话不)

    小米平板4能打电话吗(小米平板4能打电话不)

  • iphone断触怎么解决(ios手机断触)

    iphone断触怎么解决(ios手机断触)

  • 录屏怎么调出来(苹果快捷录屏怎么调出来)

    录屏怎么调出来(苹果快捷录屏怎么调出来)

  • 一个工作簿默认有几个工作表(一个工作簿默认由()张工作表组成)

    一个工作簿默认有几个工作表(一个工作簿默认由()张工作表组成)

  • 荣耀30pro是不是曲面屏(荣耀30pro是不是莱卡)

    荣耀30pro是不是曲面屏(荣耀30pro是不是莱卡)

  • 如何将横排改竖排文字(如何将横排改竖排视频)

    如何将横排改竖排文字(如何将横排改竖排视频)

  • 腾讯视频只有声音没有画面怎么回事(腾讯视频只有声音没画面)

    腾讯视频只有声音没有画面怎么回事(腾讯视频只有声音没画面)

  • 微信频繁切换账号有影响吗(微信频繁切换账号会不会封号)

    微信频繁切换账号有影响吗(微信频繁切换账号会不会封号)

  • ipadpro保修期多久(ipadpro 保修期)

    ipadpro保修期多久(ipadpro 保修期)

  • 光纤猫光信号闪蓝色(光纤猫光信号闪蓝灯)

    光纤猫光信号闪蓝色(光纤猫光信号闪蓝灯)

  • blaal00是什么型号(bla-al00是华为什么型号和图片)

    blaal00是什么型号(bla-al00是华为什么型号和图片)

  • 怎么给小电充电宝充电(怎么给小电充电宝)

    怎么给小电充电宝充电(怎么给小电充电宝)

  • 苹果11怎么个人开热点(iphone 11怎么打开个人热点)

    苹果11怎么个人开热点(iphone 11怎么打开个人热点)

  • 手机地理位置怎么打开(手机地理位置怎么打开oppo)

    手机地理位置怎么打开(手机地理位置怎么打开oppo)

  • iphone查看谁连了热点(iphone怎么查看谁连了我的wifi)

    iphone查看谁连了热点(iphone怎么查看谁连了我的wifi)

  • 手机云盘在哪打开(手机云盘在哪打开oppo)

    手机云盘在哪打开(手机云盘在哪打开oppo)

  • 腾讯手游助手怎么定位?(腾讯手游助手怎么把游戏放到桌面)

    腾讯手游助手怎么定位?(腾讯手游助手怎么把游戏放到桌面)

  • backupnotify.exe是什么文件的进程 backupnotify进程安全吗

    backupnotify.exe是什么文件的进程 backupnotify进程安全吗

  • 基本保险包括
  • 农产品的税率是9%吗
  • 行政单位财政直接支付适用范围
  • 企业注销库存怎么做账务处理
  • 无形资产减值准备可以转回吗
  • 两个账户往来款怎么做现金流量表
  • 知识产权申报费用多少钱
  • 固定资产加速折旧税收优惠政策
  • 企业销售使用过的固定资产如何开票
  • 资本化的借款利息支出计入什么科目
  • 预缴税款缴多了怎么办
  • 外币账户间互转流程
  • 购买原材料的费用
  • 购买无形资产的价款超过正常信用
  • 个人承包经营所得是什么意思
  • 应收款未收到怎么做账
  • 注册资本没有到账怎么做账
  • 工会没有税号怎么开普票
  • 合并起来
  • 基金会可以投资企业吗
  • 文化建设事业费优惠政策
  • 土地出让金如何缴纳
  • 批发led电子屏
  • 公司购买模具的会计科目
  • 修缮房屋的防水工程的账务处理?
  • 吸收合并公司后的债务处理
  • 用后期进项抵欠怎么做账
  • 税法中的视同行为如何开具发票
  • 代销商品手续费计入什么科目
  • 企业从政府取得的经济资源均应当
  • 苹果电脑双系统好不好
  • php设计思路
  • win7旗舰版系统激活工具
  • 什么情况下个人需缴纳房产税
  • php做网页
  • php面向对象的理解
  • 卷积神经网络结构
  • iconfont原理
  • 转回已核销的坏账分录
  • wordpress安装插件无法复制
  • mysql binlog是什么
  • 材料采购是什么类科目
  • 怎么查看python
  • 支付股息如何做账
  • mongodb基本操作命令
  • 医疗机构销售药品是否征收增值税
  • 小规模公司注销时账务要如何处理
  • win2008 enterprise R2 x64 中安装SQL server 2008的方法
  • 银行开的手续费发票开错了
  • 一般纳税人劳务费税率是多少2023
  • 人工费没有发票怎么入账
  • 文化事业建设费会计分录
  • 开办费的最新账务处理2021
  • 银行利息收入如何记账
  • 增值税负数发票怎么做账
  • 应收账款收不回来怎么处理比较好
  • 扣非净利润增长率
  • 填制费用报销单怎么填写
  • 高价购买股权
  • 公司投资款怎么算
  • 材料采购是什么会计要素
  • 交易性金融资产属于流动资产
  • 房地产开发企业建造的商品房,在出售前
  • sql储存过程
  • Ubuntu系统中文输入法
  • 怎么u盘装系统win10
  • linux的文件结构
  • windows10 预览
  • jq判断浏览器
  • input输入@弹出框
  • python极简讲义pdf
  • javascript几种类型
  • 税务局的章
  • 河南电子税务局残保金怎么申报
  • 国税发票打印汇总怎么弄
  • 深圳市国税局副局长是谁
  • 生产变压器设备
  • 黑龙江省电子税务局官网下载
  • 税务局 协查函
  • 合肥报税网站
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设