我们知道,函数内部是可以调用外部的数据的,但是外部的数据无法调用内部的数据
如果一个函数结束,它在其生命周期内所创建的数据都会被销毁。
但是有的时候,我们却十分需要一些函数内部的数据得以保存,希望这些数据不管函数是否存在,其都不被销毁,并且能在以后的多次调用时都能起到记载关键信息的作用,但是我们又不想引用全部变量,这就是产生闭包的原因。
闭包:起到函数内外数据交的作用,闭包中的自由变量,游离于函数之外,长生不老。
这个自由变量,可以使得闭包有很多作用,比如实现单例模式。
工厂装饰器:为@语法糖添加参数,并且这个参数可以传递给内部函数,如FLASK路由实现
来看看下面的代码
def factory(route):
print("现在的路径是这个啊:",route)
def wrapper(func):
list = []
def inner(*args,**kwargs):
print("知道了,是这个路径,"+ route)
res = func(*args,**kwargs)
if not list:
list.append(route)
print('这个列表为空,但就这一次哦')
return list,res
return inner
return wrapper
@factory('/index')
def test(page):
return page+'的处理结果'
@factory('/index2')
def test2(page):
return page + '的处理结果'
print(test('index页面1'))
print(test('index页面2'))
print(test('index页面3'))
print(test2('index2页面1'))
print(test2('index2页面2'))
print(test2('index2页面3'))
打印 结果:
现在的路径是这个啊: /index
现在的路径是这个啊: /index2
知道了,是这个路径,/index
这个列表为空,但就这一次哦
(['/index'], 'index页面1的处理结果')
知道了,是这个路径,/index
(['/index'], 'index页面2的处理结果')
知道了,是这个路径,/index
(['/index'], 'index页面3的处理结果')
知道了,是这个路径,/index2
这个列表为空,但就这一次哦
(['/index2'], 'index2页面1的处理结果')
知道了,是这个路径,/index2
(['/index2'], 'index2页面2的处理结果')
知道了,是这个路径,/index2
(['/index2'], 'index2页面3的处理结果')
Process finished with exit code 0
在这段代码中,我们可以窥探到小细节:
@的优先级应该是很高的,函数一开始就载入了全部的装饰器
后期的使用过程中,列表内的变量并没有被销毁,这个列表即为自由变量,即使它是在factory内部
通过这样的传递方法,可以清晰的掌握当前路径,所需要的参数,并返回处理结果,数据交互,十分灵活。