python之有参装饰器_02

Posted haibaiwuchang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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进程传参操作了,如果我们要穿多个参数,也可以穿多个参数,这样就解决了无法传参的问题了!
技术图片
然后调用函数:

 

 技术图片

 

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

技术图片

 

 

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

技术图片

 

 

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

以上是关于python之有参装饰器_02的主要内容,如果未能解决你的问题,请参考以下文章

Python:装饰器之有参装饰器

Python-23_装饰器-04_练习---无参装饰器有参装饰器

python--有参装饰器迭代器

python中的无参装饰器和有参装饰器

python基础第19回 多层,有参装饰器 递归 二分法

Python记录11:叠加多个装饰器+有参装饰器