**
装饰器在我们有些时候为已经定义的函数添加新的功能是一个比较好用的方法,运用技巧比较简单,但是不清楚其运行机制,用起来就不会那么得心应手。本篇主要浅析一下它的运行机制,让你能够用起来更加的灵活。
**
1.原则: 简单谈一下,装饰器的原则在于不改变装饰函数的源代码和其调用方式,也就是原函数的代码你不能改,调用时该几个参数,你还是传几个参数。
2用法:首先要明白两点:一、装饰器本身也是一个函数。二、函数名可以做变量。明白了这两点,就会很好理解装饰器的用法了,要是不明白,结合后面的例子领会也很容易。
我们先看一个很简单的例子:
def func_1():
print('b')
>>>b
这个函数我们简单的打印小写字母b,下面我们想添加一个新功能就是先打印字母a,在打印字母b。
def func(func):
def func_2():
print('a')
func()
return func_2
@func
def func_1():
print('b')
func_1()
>>>>a
>>>>b
我们可以看到,我们新增加了一个函数func,然后在我们最初的函数func_1上面增加了一个符号@加上我们新写的那个函数名func。我们调用最初那个函数的源码没有改变,调用方式也没有改变就完成了新增加的功能。再次调用时,结果便是先打印a再打印b,这样我们就完成了一个简单的装饰器。
装饰器的本质其实就是把原函数的指针给换成了我们装饰器函数里面定义的函数func_2的指针,这样你调用原函数的时候,其实运行的就是func_2的内容。而原函数就是装饰器传入的参数,传入的参数名func可以任意取名,只是在func_2里面调用时,用你取的参数名后面加小括号调用就是了。你想增加的功能就在func_2里面随便加就是了,记住运行时是从上往下运行,你想在原函数前加功能就在调你传入的函数前面添加代码。下面是一个在原函数后面增加功能的例子:
def func_1(xxxx):
def func_3():
xxxx()
print('c')
return func_3
@func_1
def func_2():
print('b')
func_2()
>>>b
>>>c
这里功能就是在原函数后面添加功能,打印字母c。这里的名字都换了一下,就是为了说明取名字不重要,只要调用的时候对应就好。
3、如果需要传入参数的话,也只需要对应的函数传入就好`
def func_1(xxxx):
def func_3(arg):
xxxx(arg)
print('c')
return func_3
@func_1
def func_2(arg):
print('b'+arg)
func_2('d')
>>>bd
>>>c
因为装饰器的原理是把装饰器里面定义的函数传给原函数,所以调用原函数func_2时候其实就是调用的装饰器里面定义的函数func_3。所以只需要装饰器里面定义函数的参数和原函数一致,当然func_3里面调用的函数xxxx本身就是相当于原函数, 所以它的参数也相应的要一致。