一 . 装饰器
装饰器用途:为已经存在的函数添加功能。
当需要给已完成函数增加一些功能时,可以直接改动。但有时候对于一个大项目来说改动一处可能会造成其它相关部分报错,利用装饰器可以在不必改动原有函数的前提下增加功能,经常被用于事务处理,日志记录,验证权限,调试测试等有需求的场景
原函数:
def add(x,y):
return x+y
想在原来的函数上添加返回原始数据的功能,用装饰器怎么实现呢?
第一步:
在decorator函数中定义一个新函数包装传入的函数f,用return f(x,y)添加输出原始数据的功能,
注:装饰器的返回值是一个函数对象
def decorator(f):
def new_f(x,y):
print('参数1为%d,参数2为%d'%(x,y))
return f(x,y)
return new_f
第二步:在原函数定义前用@引导装饰器函数即可
@decorator
def add(x,y):
return x+y
print(add(2,3))
二 . 闭包
闭包:若调用某函数时,该函数将其内部定义的函数作为返回值,则所返回的函数成为闭包。装饰器是闭包的一种形式。
在上面例子中,new_f(x,y)就是一个闭包
再举一个简单例子:
inner(y)是嵌套于outer(x)中的内部函数,inner引用了外部作用域变量x,这个内部函数inner 就是一个闭包
代码:
def outer(x):
def inner(y):
return x+y
return inner
f=outer(5)
print(f(20))