一对象的概念
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_decorator1
def a_function_requiring_decoration1():
print(" 我是函数本身功能 ")
输出上面的函数可以看到如下结果:
我是在 a_func () 之前的装饰
我是函数本身功能
我是在 a_func () 之前的装饰 )
需要注意的是,调用一次装饰器只能对一个函数装饰一次,多余的函数将不被装饰,这很像画油画,被装饰的函数就像是画板,即使两张画板叠在一起,颜色也只对最上层的画板起作用。但是在画油画时,画板颜色是可以被层层覆盖的,这是不是意味着装饰器也可以这样叠加呢?我们来看下面的例子。
@a_new_decorator1
@a_new_decorator1
def a_function_requiring_decoration2():
print(" 我是另一个函数 ")
对它进行输出,得到如下结果
我是在 a_func () 之前的装饰
我是在 a_func () 之前的装饰
我是另一个函数
我是在 a_func () 之后的装饰
我是在 a_func () 之后的装饰
通过输出我们可以发现装饰器效果也是可以层层叠加的,这样就让“装饰”这个功能变得更加有可用性。