一. 什么是装饰器
知乎某大佬如是说:内裤可以用来遮羞,但是到了冬天它没法为我们防风御寒,聪明的人们发明了长裤,有了长裤后宝宝再也不冷了,装饰器就像我们这里说的长裤,在不影响内裤作用的前提下,给我们的身子提供了保暖的功效。
装饰器本质上是Python函数,可以为已存在的对象添加额外的功能,同时装饰器还可以抽离出与函数无关的重用代码。具体应用场景如:插入日志、性能测试、事务处理、缓存、权限校验等。
换言之
装饰器不能影响原函数的功能,装饰器是独立出来的函数。谁调用它,谁就可以使用它的功能。
二.举个栗子
add的功能是计算x和y的值,我们称作功能函数。
logger的作业是在执行add函数的同时再打印了其他的信息,这部分的作为add的功能增强,我们称为装饰。
在logger里我们可以加入其他类似的功能函数,也能包装它,可以进行复用。
1.引子
#功能函数 def add(x,y): return x+y #装饰函数 def logger(fn): print('frist') x = fn(4,5) print('second') return x print(logger(add)) #把函数add传给logger ,return x+y #print('frist') #print('secend') # x = fn(4,5) ==> x = 4 y= 5 x= 4+5 = 9 #return 9
frist
second
9
2.提取参数
x,y的参数都放在logger函数内部了,影响函数的灵活性,此处我们可以提取出来。
def add(x,y): return x + y def logger(fn,*args,**kwargs): print('frist') x = fn(*args,**kwargs) print('second') return x print(logger(add,1,y=11))
frist
second
12
3.柯里化
def add(x,y): return x + y def logger(fn): def wrapper(*args,**kwargs): print('begin') x = fn(*args,**kwargs) print('end') return x return wrapper print(logger(add)(5,y=11))
begin
end
16
懵逼ing
以下为个人理解,左边为非柯里化函数,右边是柯里化函数。