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

  • puk码忘记了怎么解锁(puk码)(puk码忘记了怎么解锁 中国联通)

    puk码忘记了怎么解锁(puk码)(puk码忘记了怎么解锁 中国联通)

  • 小米平板5怎么设置定时开关机(小米平板5怎么设置儿童限制功能)

    小米平板5怎么设置定时开关机(小米平板5怎么设置儿童限制功能)

  • macbook截图快捷键是什么(macbook截图快捷键)

    macbook截图快捷键是什么(macbook截图快捷键)

  • 魅族18背面是什么材质的(魅族18s后盖是什么材质)

    魅族18背面是什么材质的(魅族18s后盖是什么材质)

  • excel表格怎么自动换行(excel表格怎么自动排序)

    excel表格怎么自动换行(excel表格怎么自动排序)

  • 华为mate30线性马达如何设置(华为mate30线性马达怎么打开)

    华为mate30线性马达如何设置(华为mate30线性马达怎么打开)

  • 怎么修改朋友圈所发的文字(怎么修改朋友圈可见时间设置)

    怎么修改朋友圈所发的文字(怎么修改朋友圈可见时间设置)

  • 一台笔记本电脑多重(一台笔记本电脑屏幕的面积大约是4)

    一台笔记本电脑多重(一台笔记本电脑屏幕的面积大约是4)

  • 如何隐藏快手id(如何隐藏快手的收藏)

    如何隐藏快手id(如何隐藏快手的收藏)

  • 网易云音乐切换英文(网易云音乐切换账号在哪里)

    网易云音乐切换英文(网易云音乐切换账号在哪里)

  • 苹果x一晚掉电多少正常(iphonex一夜掉电40)

    苹果x一晚掉电多少正常(iphonex一夜掉电40)

  • 华为p40pro手机发热(华为p40pro手机发热怎么解决)

    华为p40pro手机发热(华为p40pro手机发热怎么解决)

  • 平板自动跳屏怎么回事(平板屏幕自动跳转)

    平板自动跳屏怎么回事(平板屏幕自动跳转)

  • linkact接口是干嘛的(link接口什么意思)

    linkact接口是干嘛的(link接口什么意思)

  • 手机铃声没有声音是怎么回事(手机铃声没有声音只有震动是怎么回事)

    手机铃声没有声音是怎么回事(手机铃声没有声音只有震动是怎么回事)

  • 平板能不能下载钉钉(平板能不能下载ps软件)

    平板能不能下载钉钉(平板能不能下载ps软件)

  • 数据透视表字段名无效什么意思(数据透视表字段名无效怎么解决)

    数据透视表字段名无效什么意思(数据透视表字段名无效怎么解决)

  • 华为屏幕组件包括什么(华为屏幕组件包括电池吗)

    华为屏幕组件包括什么(华为屏幕组件包括电池吗)

  • 华为手环4上市时间(华为手环4上市时间及价格)

    华为手环4上市时间(华为手环4上市时间及价格)

  • 如何将电脑格式化(如何将电脑格式化win7)

    如何将电脑格式化(如何将电脑格式化win7)

  • vivo z5什么时候上市(vivoz5什么时候上市多少钱)

    vivo z5什么时候上市(vivoz5什么时候上市多少钱)

  • 快手小店的钱怎么提现(快手小店的钱怎么提现到支付宝)

    快手小店的钱怎么提现(快手小店的钱怎么提现到支付宝)

  • 金立8002s是什么型号(金立8006是什么手机)

    金立8002s是什么型号(金立8006是什么手机)

  • 腾讯视频如何用手机号登录(腾讯视频如何用支付宝支付会员)

    腾讯视频如何用手机号登录(腾讯视频如何用支付宝支付会员)

  • iphone7plus续航怎么样 苹果iphone7plus续航能力介绍(苹果7plus续航)

    iphone7plus续航怎么样 苹果iphone7plus续航能力介绍(苹果7plus续航)

  • 查付款记录需要什么?
  • 进项税额转出补交税款
  • 计入职工福利费的有哪些
  • 注册税务师报名条件
  • 开一般户需要提交人行吗
  • 个人向个人借款100万交税吗
  • 企业给职工交的养老金哪里去了
  • 采购设备包含安装费用吗
  • 消费取得普通发票怎么开
  • 对方公司退回货款,但发票已经开了怎么写摘要
  • 期末数未分配利润为负数的会计分录怎么处理?
  • 如何知道企业是查账征收还是核定征收
  • 对公账户分为一般户和基本户
  • 什么时候计入其他综合收益什么时候计入投资收益
  • 所得税税前扣除税金有哪些
  • 1697510110
  • 无u刷bios一直闪
  • 电脑显示器模糊不清晰是什么原因
  • 购买预付卡如何记账
  • 电脑扩展卷是灰色的的怎么办
  • 其他应付款与应付款的区别
  • 000.exe病毒
  • 进程com
  • php静态缓存
  • tepac接口
  • 圣胡安岛战争
  • 边角料是否计入生产成本
  • Web前端开发知识点总结
  • 公司发放加班补贴 固定金额
  • 达摩院 2021
  • php魔术方法autoload
  • 个税计税周期 一年
  • 未缴足注册资本
  • 个税申报报的是已离职的员工员工投诉
  • 工程公司项目管理部管理制度
  • 暂估入库成本的会计分录
  • Python的aiohttp模块如何使用?
  • 股东投钱一般怎么投
  • 什么叫网银盾账户
  • 入伙退伙协议要盖章吗
  • 税法中对差旅费的处理
  • sql语句求中位数
  • 企业需要购买两种保险吗
  • 开矿泉水发票怎么开?
  • 库存商品怎么结转收入
  • 补充登记法的操作步骤
  • 未实缴出资的股东退股
  • 白条可以入账吗?
  • 教育局给幼儿园的补贴
  • 融资租入固定资产的账务处理
  • 本月没有认证的发票怎么做账
  • 厂房的使用寿命
  • 财务会计期末总结
  • 合资注册公司应该注意什么
  • 冲销销售收入分录
  • 费用利润率的意思
  • 流动比率和速动比率过高说明什么
  • 私营公司无形资产怎么算
  • 检查sql脚本语法
  • mysql版本信息
  • 微软在印度的投资
  • ubuntu设置u盘启动项
  • win8的开机启动项在哪里
  • 如何让计算机自动关机
  • 微软推送Win11226x1.2050
  • windows的气泡屏保会加速
  • windowsxp是什么时候正式发布
  • win10预览体验推荐哪个通道
  • 安卓sdk目录下用来存放各种版本sdk的目录是
  • django 实例
  • 用python播放音乐
  • 学完js不会用怎么办
  • 详解16型人格
  • 销售黄金的基本知识
  • 支付水电费的增值税税率文件
  • 国家税务总局2016年17号公告
  • 购车绿本是什么样的?
  • 纳税人的种类包括
  • 大修费属于什么费用
  • 深圳市百旺信投资有限责任公司
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设