python之有参装饰器_02
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进程传参操作了,如果我们要穿多个参数,也可以穿多个参数,这样就解决了无法传参的问题了!
![](https://img2020.cnblogs.com/blog/1956096/202007/1956096-20200707234125807-1728115083.png)
然后调用函数:
所以我们总结下装饰器模板:
这里可能会有疑问:闭包不是说只在自己的外层去找食物吗?
上面的代码我们关掉一部分,可以看出,wrapper其实是outter的子代码,所以wrapper需要的参数其实就是outter的子代码需要参数
那么outter的子代码需要参数需要去它的外层找,它的外层此时就是code所以这样去解释就没毛病了。
这次讲了两个知识点:
1:@函数()运行的优先级
2:在func和wrapper两个参数都不能改动的情况下,怎么在对函数内部进行额外的传参