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

一、闭包的原理、结构

二、装饰器的引入

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

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 判断语句

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值