位置: 编程技术 - 正文

浅析Python编写函数装饰器(python怎么编函数)

编辑:rootadmin

推荐整理分享浅析Python编写函数装饰器(python怎么编函数),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python怎么写一个函数,python如何编写函数,python编写程序函数,python中编写函数,python怎么写一个函数,python编写函数有什么好处,python编写程序函数,python中编写函数,内容如对您有帮助,希望把文章链接给更多的朋友!

编写函数装饰器

本节主要介绍编写函数装饰器的相关内容。

跟踪调用

如下代码定义并应用一个函数装饰器,来统计对装饰的函数的调用次数,并且针对每一次调用打印跟踪信息。

这是一个通过类装饰的语法写成的装饰器,测试如下:

运行的时候,tracer类和装饰的函数分开保存,并且拦截对装饰的函数的随后的调用,以便添加一个逻辑层来统计和打印每次调用。

装饰之后,spam实际上是tracer类的一个实例。

@装饰器语法避免了直接地意外调用最初的函数。考虑如下所示的非装饰器的对等代码:

测试如下:

这一替代方法可以用在任何函数上,且不需要特殊的@语法,但是和装饰器版本不同,它在代码中调用函数的每个地方都需要额外的语法。尽管装饰器不是必需的,但是它们通常是最为方便的。

扩展——支持关键字参数

下述代码时前面例子的扩展版本,添加了对关键字参数的支持:

测试如下:

也可以看到,这里的代码同样使用【类实例属性】来保存状态,即调用的次数self.calls。包装的函数和调用计数器都是针对每个实例的信息。

使用def函数语法写装饰器

使用def定义装饰器函数也可以实现相同的效果。但是有一个问题,我们也需要封闭作用域中的一个计数器,它随着每次调用而更改。我们可以很自然地想到全局变量,如下:

这里calls定义为全局变量,它是跨程序的,是属于整个模块的,而不是针对每个函数的,这样的话,对于任何跟踪的函数调用,计数器都会递增,如下测试:

浅析Python编写函数装饰器(python怎么编函数)

可以看到针对spam函数和egg函数,程序用的是同一个计数器。

那么如何实现针对每一个函数的计数器呢,我们可以使用Python3中新增的nonlocal语句,如下:

运行如下:

这样,将calls变量定义在tracer函数内部,使之存在于一个封闭的函数作用域中,之后通过nonlocal语句来修改这个作用域,修改这个calls变量。如此便可以实现我们所需求的功能。

陷阱:装饰类方法

【注意,使用类编写的装饰器不能用于装饰某一类中带self参数的的函数,这一点在Python装饰器基础中介绍过】即如果装饰器是如下使用类编写的:

当它装饰如下在类中的方法时:

这时程序肯定会出错。问题的根源在于,tracer类的__call__方法的self——它是一个tracer实例,当我们用__call__把装饰方法名重绑定到一个类实例对象的时候,Python只向self传递了tracer实例,它根本没有在参数列表中传递Person主体。此外,由于tracer不知道我们要用方法调用处理的Person实例的任何信息,没有办法创建一个带有一个实例的绑定的方法,所以也就没有办法正确地分配调用。

这时我们只能通过嵌套函数的方法来编写装饰器。

计时调用

下面这个装饰器将对一个装饰的函数的调用进行计时——既有针对一次调用的时间,也有所有调用的总的时间。

运行结果如下:

这里要注意的是,map操作在Python3中返回一个迭代器,所以它的map操作不能和一个列表解析的工作直接对应,即实际上它并不花时间。所以要使用list(map())来迫使它像列表解析那样构建一个列表

添加装饰器参数

有时我们需要装饰器来做一个额外的工作,比如提供一个输出标签并且可以打开或关闭跟踪消息。这就需要用到装饰器参数了,我们可以使用装饰器参数来制定配置选项,这些选项可以根据每个装饰的函数而编码。例如,像下面这样添加标签:

我们可以将这样的结果用于计时器中,来允许在装饰的时候传入一个标签和一个跟踪控制标志。比如,下面这段代码:

这个计时函数装饰器可以用于任何函数,在模块中和交互模式下都可以。我们可以在交互模式下测试,如下:

有关Python编写函数装饰器相关知识小编就给大家介绍到这里,希望对大家有所帮助!

浅析Python基础-流程控制 Python编程语言的作用非常强大,而且其应用方便的特点也对开发人员起到了非常大的作用。在这里我们就可以先从Python流程控制关键字的相关概念开始

使用Python编写基于DHT协议的BT资源爬虫 关于DHT协议DHT协议作为BT协议的一个辅助,是非常好玩的。它主要是为了在BT正式下载时得到种子或者BT资源。传统的网络,需要一台中央服务器存放种

Python的Socket编程过程中实现UDP端口复用的实例分享 关于端口复用一个套接字不能同时绑定多个端口,如果客户端想绑定端口号,一定要调用发送信息函数之前绑定(bind)端口,因为在发送信息函数(sendto,或

标签: python怎么编函数

本文链接地址:https://www.jiuchutong.com/biancheng/384383.html 转载请保留说明!

上一篇:基于python yield机制的异步操作同步化编程模型(基于python的应用)

下一篇:浅析Python基础-流程控制(python理论基础)

  • 递延所得税如何影响所得税费用
  • 什么是增值税征免年限
  • 上年度暂估的票回不来一直挂帐吗
  • 劳务税能退税吗现在
  • 银行对账单由谁去取
  • 原材料盘亏自然损耗
  • 增值税加计扣除政策
  • 固定资产清理属于流动资产吗
  • 过路费认证用去哪里认证
  • 非营利性科研机构接受企业基础研究收入免征企业所得税
  • 法人收到票据用什么抵扣
  • 将自制的一批新产品用于对外投资,生产成本为300000
  • 未开发票收入交增值税怎么做账?
  • 固定资产领用原材料要考虑增值税吗?
  • 员工迟到扣款该怎么处理
  • 营改增安装服务费税率
  • 贷款已支付属于什么会计科目
  • 失控包括
  • 盈余公积可以发放工资吗
  • 酒店挂账要做收款凭证吗
  • 吊车费计什么科目
  • 未取得全额发票怎么处理
  • 关联企业之间借款的处理
  • 跨年多计提折旧的账务处理
  • 速动资产不包括存货和预付账款
  • 款已付没有发票就入账
  • 2019年以后转登记为小规模纳税人有无时间要求?
  • linux怎么挂起
  • 为什么iphone手机闹钟定了不响
  • 物流公司的收入来源有哪些
  • 增值税直接减征的开什么发票
  • 缅甸安达曼海
  • vscode怎么运行前端
  • YII Framework的filter过滤器用法分析
  • 顺流交易的会计处理
  • 《ai人工智能》
  • 进项逾期未认证怎么办
  • spring的文章
  • zip 压缩命令
  • 数据库如何迁移数据库表
  • 什么是付出对价的公允
  • php 清除缓存
  • 公司代买社保怎么收费
  • 帝国cms视频教程
  • 公司银行开户的经办人有无风险
  • 支付国外佣金的税率多少
  • 携程 海外
  • 根据《中华人民共和国食品安全法》
  • 未收回的货款属于什么会计科目
  • SQLServer2005 XML数据操作代码
  • 固定资产原值增加折旧怎么算
  • 研发费用形成无形资产的摊销怎么处理
  • 长期股权投资的账务处理
  • 职工薪酬费用属于什么费用
  • 实收资本印花税属于什么税目
  • 5000以下的固定资产一次性计入费用
  • 未分配利润是净利润吗
  • mysql中删除表中的数据
  • win8 无线网络连不上
  • win10系统怎么手机投屏到电脑
  • 轻松跨越英语关在线阅读
  • 在苹果电脑上怎么下载软件
  • solaris 磁盘管理
  • windows无法启动怎么解决
  • win8wifi受限
  • win7不同用户下装不同软件
  • 无需u盘安装系统
  • mac safari浏览器网页不能正常显示
  • centos7 zsh
  • linux unix操作系统
  • 如何清楚windows搜索记录
  • redhat linux安装
  • cocos2dx游戏开发进阶卷这本书怎么样
  • opengl es 2.0是什么
  • jquery设置鼠标样式
  • js动态生成的id怎样获取
  • javascript构成
  • Python selenium 父子、兄弟、相邻节点定位方式详解
  • 国家税务总局介绍
  • 地方税务局几点下班
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设