30行代码让你彻底理解工厂装饰器,闭包的原理

我们知道,函数内部是可以调用外部的数据的,但是外部的数据无法调用内部的数据

如果一个函数结束,它在其生命周期内所创建的数据都会被销毁。

但是有的时候,我们却十分需要一些函数内部的数据得以保存,希望这些数据不管函数是否存在,其都不被销毁,并且能在以后的多次调用时都能起到记载关键信息的作用,但是我们又不想引用全部变量,这就是产生闭包的原因。

闭包:起到函数内外数据交的作用,闭包中的自由变量,游离于函数之外,长生不老。

这个自由变量,可以使得闭包有很多作用,比如实现单例模式。

工厂装饰器:为@语法糖添加参数,并且这个参数可以传递给内部函数,如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内部

通过这样的传递方法,可以清晰的掌握当前路径,所需要的参数,并返回处理结果,数据交互,十分灵活。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章