闭包函数与装饰器
闭包函数
闭包函数的定义:
闭代表函数在另一个函数的内部
包代表该函数访问了一个来自外层函数的变量
当我们的函数需要传参的时候,我们通常有两种方式,方式一是直接传参,但是在有的情况下,我们无法直接修改函数的参数,通过名称空间的相关知识,我们就可以用闭包函数来为函数进行传参操作,相比于直接传参,闭包函数不改变原函数的源代码以及调用方式,出于程序的稳定性来看,当我们需要为一个函数进行传参的时候,推荐使用闭包函数。
def outter(x):
x = 111
def wrapper(): # wrapper = 闭包函数的内存地址
print(x)
return wrapper # 一定不要加括号
#return 后接闭包函数的内存地址
有了闭包函数的知识点,我们就可以解锁一个新的用法——装饰器。
装饰器
什么是装饰器?
装饰器的作用是在不修改函数的源代码以及调用方式的前提下用来为其他函数添加新功能
为什么要有装饰器?
因为软件一旦上线运行之后,就应该遵循开放封闭原则:
1.开放指的是开放新功能
2.封闭指的是对修改源代码封闭
在此原则下,我们无法对程序的源代码进行修改,因为一旦修改源代码可能会导致原先正常运行的程序崩溃。为了遵循1和2的前提并且为其他函数添加新功能,所以我们就需要装饰器来进行上述功能的实现,
怎么用装饰器?
def outter (func):
def wrapper (*args, **kwargs)
res = func(*args,**kwargs)
return res
return wrapper
这是装饰器的一般模板,我们在使用装饰器对函数进行装饰的时候,我们通过外层函数进行对内部函数的装饰,通过这种方式,我们在为内层函数赋予新功能的同时,没有改变内部函数的源代码以及调用方式。
装饰器分为无参装饰器和有参装饰器,无参装饰器使用两层闭包函数,有参装饰器使用三层闭包函数。
以下是有参装饰器的模板
def outter2(x,y,z,a,b):
def outter1(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
return outter1