重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

python完善装饰函数的简单介绍

python装饰器使用

装饰器是从英文decorator翻译过来的,从字面上来看就是对某个东西进行修饰,增强被修饰物的功能,下面我们对装饰器做下简单介绍。

成都创新互联公司是专业的富蕴网站建设公司,富蕴接单;提供网站制作、成都网站设计,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行富蕴网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

一、怎么编写装饰器

装饰器的实现很简单,本质是一个可调用对象,可以是函数、方法、对象等,它既可以装饰函数也可以装饰类和方法,为了简单说明问题,我们实现一个函数装饰器,如下代码:

有了这个装饰器,我们就可以打印出什么时候开始和结束调用函数,对于排查函数的调用链非常方便。

二、带参数的装饰器

上面的例子无论什么时候调用sum都会输出信息,如果我们需要按需输出信息怎么实现呢,这时就要用到带参数的装饰器了,如下代码:

对sum使用装饰器时没有参数,这时debug为0,所以调用sum时不会输出函数调用相关信息。

对multi使用装饰器时有参数,这时debug为1,所以调用multi时会输出函数调用相关信息。

三、函数名字问题

当我们打印被装饰后的函数名字时,不知道大家有没发现输出的不是函数本身的名字,如下代码会输出‘wrap’而不是‘sum’:

有时这种表现并不是我们想要的,我们希望被装饰后的函数名字还是函数本身,那要怎么实现呢?很简单,只需要引入functools.wraps即可,如下代码就会输出‘sum’了:

看完后是不是觉得python装饰器很简单,只要了解它的本质,怎么写都行,有好多种玩法呢。

Python进阶精华-编写装饰器为被包装的函数添加参数

注意:这种发方法并不是装饰器最常用的功能,但是在降低代码重复上可谓是首屈一指。比如:如果不使用装饰器,上述代码可能会很多:

当然,这里也有一个潜在的风险,就是当装饰器包裹的函数已经用了debug作为参数名,那么装饰器这里将会报错,所以要添加额外的一些判断来完善代码:

最后还剩下一部分比较难理解的地方,我将理解的注释在每行代码上方,这个问题就是,在打印被修饰函数的参数签名时,其实并不能正确显示参数签名,原因是因为被wrapper修饰过后的函数实际上应该使用的是wrapper的参数签名表,例如:

所以,接下来,完成最后最难的一步:

两个很实用的Python装饰器详解

这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 、网络爬虫、数据库查询的时候特别有用

timeout装饰器的代码如下

使用:

## 输出

---------------------------------------------------------------------------

TimeoutError Traceback (most recent call last)

有时候出于演示目的或者调试目的,我们需要程序运行的时候打印出每一步的运行顺序 和调用逻辑。类似写bash的时候的bash -x调试功能,然后Python解释器并没有 内置这个时分有用的功能,那么我们就“自己动手,丰衣足食”。

Trace装饰器的代码如下:

使用:

## 输出

(3): print 1 # @trace 的输出

1

(4): print 22 # @trace 的输出

22

(5): print 333 # @trace 的输出

333


分享标题:python完善装饰函数的简单介绍
文章出自:http://cqcxhl.com/article/dosoieo.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP