码迷,mamicode.com
首页 > 编程语言 > 详细

python之有参装饰器_02

时间:2020-07-08 01:31:07      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:不同的   验证   arp   今天   返回   dex   返回值   无法   用户输入   

1:无参装饰器补充:
@index(123) ==》 这个@index(123)中,index()函数调用的优先级是最高的。所以先会
先运行,然后得到的返回值,在传个@inde()的返回值
我们今天继续讲解有参知识:

技术图片

 

 

首先上面这个小案例中:我们添加一个需求,我需要在wrapper中做一个认证功能,就是用户输入账号和密码
对的我们继续,错的我们停止!

1:添加新功能,需要在warpper中去进行修改。
技术图片

 

 

2:需求:这里我们知道,做验证的数据,有可能来自数据库,磁盘文件,redis等等不同的地方,我们就把这几个添加进去,
然后做个判断,根据不同的场景进行选择....下面程序写好了,红色框框圈出来的就是新添加的!这里我们可以看出问题,下面
已经显示红色波浪线,说明,这个db_type这个变量我们没有定义它 ==》怎么办,在线等挺着急的。

技术图片

 

 

但是问题来了: 这里面的 db_type 参数从哪里来 ???
首先分析下:下面传参的地方只有两个:
1: wrapper(*args, **kwargs) 2:outter(func)
首先wrapper()参数肯定动不了,因为它是同步index(),然后func能动吗???如果你要用@,它就不能动,因为我们说了
@outter 其实是做了这件事: ==》 index = outter(index),你想,如果尼多传一个参数就变成index = outter(index,传参x)
这个时候,index就懵逼了,你要把那个地址赋值给我.....,毫无头绪一脸懵逼,因为我们知道,虽然我们调用的是outter,但是实际是调用
的wrapper的内存地址,这个时候多的x不知道是啥玩意! 。。。。所以这里也不能改 ==》具体优化如下,我们在给他来一个闭包

首先,defoutter中需要db_type,我们没办法通过正常的传参进去,我们可以用再一次闭包 如下:
这样,我们就能给outter中的db_type进程传参操作了,如果我们要穿多个参数,也可以穿多个参数,这样就解决了无法传参的问题了!
技术图片
然后调用函数:

 

 技术图片

 

  所以我们总结下装饰器模板:

技术图片

 

 

这里可能会有疑问:闭包不是说只在自己的外层去找食物吗?
上面的代码我们关掉一部分,可以看出,wrapper其实是outter的子代码,所以wrapper需要的参数其实就是outter的子代码需要参数
那么outter的子代码需要参数需要去它的外层找,它的外层此时就是code所以这样去解释就没毛病了。

技术图片

 

 

这次讲了两个知识点:
1:@函数()运行的优先级
2:在func和wrapper两个参数都不能改动的情况下,怎么在对函数内部进行额外的传参
 
 

python之有参装饰器_02

标签:不同的   验证   arp   今天   返回   dex   返回值   无法   用户输入   

原文地址:https://www.cnblogs.com/haibaiwuchang/p/13264311.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!