在实际应用中, 我们如果要把业务函数增强, 但是我们并不想在业务函数中加入非业务的侵入式代码, 我们应该把业务功能函数和增强功能函数分开. 所以就出现了以下函数写法.
def add(x, y):
return x + y
def logger(fn):
print('begin') # 增强的输出
x = fn(4, 5)
print('end') # 增强的功能
return x
print(logger(add))
但是这个写法会破坏了函数的封装, 所有的参数应该以传参的方式传进函数所以以下加入了可变参数的改进
def add(x, y):
return x + y
def logger(fn, *args, **kwargs):
print('begin') # 增强的输出
x = fn(*args, **kwargs)
print('end') # 增强的功能
return x
print(logger(add, 5, y=60))
但是这个形式不好看, 所以我们需要把参数和函数需要分开, 就使用了一个柯里化的写法
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=60))
#也可以换一种写法
#add = logger(add)
#print(add(x=5, y=10)
因为python中会有大量的这种写法出现, 所以python就提供了一个语法糖—装饰器
装饰器(无参)
def logger(fn):