千万别被名字给吓到了,什么叫做装饰器?
顾名思义,就是给另一个函数进行装饰用的,简单说就是给别的函数添加额外的功能。
注意,装饰器的本质就是一个函数。
装饰器 = 高阶函数 + 函数嵌套 + 闭包
一、高阶函数
满足如下两个条件任何一个就属于高阶函数:
(1)函数的参数是一个函数
(2)函数的返回值是一个函数
直接上例子吧:
1> 函数的参数是一个函数
def result():
print('this is a test')
def test(func):
print('abc')
res = test(result)
print(res)
输出结果:
abc
None
2>函数的返回值是一个函数
def func():
return 'this is a test'
def test():
print('abc')
return func
res = test()
print(res())
输出结果:
abc
this is a test
二、函数嵌套
def test():
pass
def test1():
pass
def test2():
pass
上面这段代码就属于函数嵌套
三、闭包
所谓闭包听起来似乎不知所云,其实就是函数的作用域。
def test():
pass
def test1():
name = 'jack'
pass
def test2():
name = 'lucy'
pass
上面这段代码中test2整个函数是一个包,test1整个函数是一个包,test整个函数是最外层的一个包。闭包可以理解为比如name = 'lucy'
这个变量只存在于test2这个包里。
四、装饰器的特点
(1)不能改变被装饰函数的源代码
(2)不能改变被装饰函数的调用方式
下面写个装饰器,自己体会。别问为什么,我不知道该怎么解释,就这么用就对了。运用之妙,存乎一心,用多了自然了然。
写个需求,给函数test()增加一个判断函数执行耗时的功能,并且把给test()函数传参数<参数是可变长,不一定是几个,也不一定是什么形式,比如列表,字典都可以。>,加上人名和年龄。
import time
def timmer(func):
def warpper(args,**kwargs):
start_time = time.time()
res = func(args,**kwargs)
end_time = time.time()
print('此次使用函数的人是%s,年龄是%s岁' %(args))
print('执行函数一共耗时%s' %(end_time-start_time))
return res
return warpper
@timmer --这里的意思是 test = timmer(test)
def test(*args,**kwargs):
time.sleep(2)
print('this is test')
return 'ok'
result = test('jack',20)
print(result)
输出结果:
this is test
此次使用函数的人是jack,年龄是20岁
执行函数一共耗时2.009286642074585
ok