二十八、闭包(装饰器的底层原理)、装饰器的引入、深入学习、带参数的装饰器

一、闭包的原理、结构

二十八、闭包(装饰器的底层原理)、装饰器的引入、深入学习、带参数的装饰器

二十八、闭包(装饰器的底层原理)、装饰器的引入、深入学习、带参数的装饰器

二、装饰器的引入

一句话总结:生成器是用来生成东西的,装饰器是用来装饰东西的。

1、定义了两个名称一样的函数(重写):只执行重写的函数

二十八、闭包(装饰器的底层原理)、装饰器的引入、深入学习、带参数的装饰器

二十八、闭包(装饰器的底层原理)、装饰器的引入、深入学习、带参数的装饰器

2、

二十八、闭包(装饰器的底层原理)、装饰器的引入、深入学习、带参数的装饰器

二十八、闭包(装饰器的底层原理)、装饰器的引入、深入学习、带参数的装饰器

运行原理:

把f1首地址(也可以记成把f1整个函数)传参给了w1方法的func,这时func=f1的首地址,开始执行w1方法,先直接return  inner ;这时候因为@w1 相当于f1=w1(f1),返回的inner函数首地址给了f1接收,f1=inner的首地址,再f1() = inner() 调用inner函数 ;

打印出  -----正在验证权限-----

再执行func() 因为func=f1,所以就相当与调用f1()函数,打印出     -----f1-----

三、装饰器的深入

1、装饰器执行的时间分析:

只要python解释器执行到@w1 这行,装饰器会自动的装饰,会调用w1 方法,只是内部定义的inner函数不执行,必须调用才执行——也就是说先调装饰的函数,再调自己f1 的函数

二十八、闭包(装饰器的底层原理)、装饰器的引入、深入学习、带参数的装饰器

二十八、闭包(装饰器的底层原理)、装饰器的引入、深入学习、带参数的装饰器

2、2个装饰器的分析:原理

①  执行到@w1、@w2时还没调用函数f1() 时:

@w1 由于@w2不是个函数,不执行,暂时跳过去,去执行@w2这行,由于@w2下面是个函数,开始执行w2方法,这时候,f1=w2(f1) ,f1=inner,**了inner函数,w1也**了inner函数, 这时会先执行w2方法,再执行w1方法。

二十八、闭包(装饰器的底层原理)、装饰器的引入、深入学习、带参数的装饰器

② f1() 函数开始调用时,顺序执行,先执行w1方法,再执行w2方法,最后两个装饰器都满足后,只执行一遍func()相当于调用f1() 函数。——正常执行

二十八、闭包(装饰器的底层原理)、装饰器的引入、深入学习、带参数的装饰器

③  记住:有print("正在装饰1")和 print("正在装饰2")时,还没调用呢,先执行w2,再执行w1

               当没有print("正在装饰1")和 print("正在装饰2")时,函数f1() 调用时,正常顺序执行,两个装饰器都满足后,只                  最后执行一遍func()

二十八、闭包(装饰器的底层原理)、装饰器的引入、深入学习、带参数的装饰器

二十八、闭包(装饰器的底层原理)、装饰器的引入、深入学习、带参数的装饰器

3、想要让闭包的函数能形成适合装饰各种函数的,需要考虑参数和返回值的问题。

 

二十八、闭包(装饰器的底层原理)、装饰器的引入、深入学习、带参数的装饰器

例子:

二十八、闭包(装饰器的底层原理)、装饰器的引入、深入学习、带参数的装饰器

二十八、闭包(装饰器的底层原理)、装饰器的引入、深入学习、带参数的装饰器

4、可以实现在服务器端,记录用户的访问痕迹,也就是你访问了什么都给你记录着呢。

二十八、闭包(装饰器的底层原理)、装饰器的引入、深入学习、带参数的装饰器

二十八、闭包(装饰器的底层原理)、装饰器的引入、深入学习、带参数的装饰器

四、带参数的装饰器

1、如果装饰器  @w1("heihei")  这类的格式带参数,那闭包的改进,就是在装饰的函数外再多加一层函数,函数的参数就是接收的值。

2、为装饰器添加参数的目的:可以在闭包里进行一些别的业务逻辑处理,比如if elif 判断语句

二十八、闭包(装饰器的底层原理)、装饰器的引入、深入学习、带参数的装饰器