Python|装饰器
一对象的概念python的所有内容都可以作为对象,这意味着这些内容可以作为参数作用于其他的“对象”,这不难理解,就像在函数中,可以把另一个函数作为参数,甚至是类作为参数,,因此经常看到函数的“嵌套”使用。def hi():return "hi yasoob!"def doSomethingBeforeHi(func):print("我是在executing hi()之前的装饰")print(func())doSomethingBeforeHi(hi)在这个例子中得到的输出如下:我是在executing hi()之前的装饰hi yasoob!可以的看到:之前定义的函数hi作为doSomethingBeforeHi这个函数的参数,并且在输出中并不影响它本身。二装饰器的作用顾名思义,装饰器的首要作用就是“装饰”,它装饰的种类有很多,只要是python的对象都可以被它所装饰。那装饰的意义在哪里呢?在一个函数增加功能但是不改变其中代码时,就可以使用装饰器来完善这种功能,这样做的意义在哪里呢?当这种新增功能需要运用到很多函数时,就只需要调用装饰器,而不是在每个函数上去修改,这样就节省了很多的时间和精力。三装饰器的用法最简单的装饰器其实就是上面的案例,这也是最直接易懂的——将待“装饰”的函数作为参数放入起“装饰”作用的函数中。当然,python提供了更加简洁且可用性更强的方法。首先引入对应的模块,然后定义装饰器,装饰器的定义方法和函数一致,在装饰器中,使用@wraps()的方法来接受一个函数进行封装,在它之后定义需要增加的内容,具体操作相信大家看代码就一目了然了。from functools import wraps#引入wraps模块def a_new_decorator1(a_func):#定义装饰器@wraps(a_func)#接收“a_func“函数进行装饰def wrapTheFunction1():#定义装饰内容print("我是在a_func ()之前的装饰")a_func()#保留函数自身功能print("我是在a_func ()之后的装饰")return wrapTheFunction1在这个例子中,“wrapTheFunction1”就是定义的“装饰”函数,也可以理解成“装饰”的方法。在装饰器定义完成后,接下来就是它的封装和使用了。封装装饰器的方法很简单,只需要@符号加上装饰器名称即可。@a_new_decorator1调用装饰器时,只需要在封装好的装饰器下面定义或者调用相应的函数即可。@a_new_decorator1def a_function_requiring_decoration1():print("我是函数本身功能")输出上面的函数可以看到如下结果:我是在a_func ()之前的装饰我是函数本身功能我是在a_func ()之前的装饰)需要注意的是,调用一次装饰器只能对一个函数装饰一次,多余的函数将不被装饰,这很像画油画,被装饰的函数就像是画板,即使两张画板叠在一起,颜色也只对最上层的画板起作用。但是在画油画时,画板颜色是可以被层层覆盖的,这是不是意味着装饰器也可以这样叠加呢?我们来看下面的例子。@a_new_decorator1@a_new_decorator1def a_function_requiring_decoration2():print("我是另一个函数")对它进行输出,得到如下结果我是在a_func ()之前的装饰我是在a_func ()之前的装饰我是另一个函数我是在a_func ()之后的装饰我是在a_func ()之后的装饰通过输出我们可以发现装饰器效果也是可以层层叠加的,这样就让“装饰”这个功能变得更加有可用性。END主 编 | 王文星责 编 | 黄章鱼能力越强,责任越大。实事求是,严谨细致。——where2go 团队微信号:算法与编程之美