python之有参装饰器_02

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

python之有参装饰器_02

 

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

 

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

python之有参装饰器_02

 

但是问题来了: 这里面的 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进程传参操作了,如果我们要穿多个参数,也可以穿多个参数,这样就解决了无法传参的问题了!
然后调用函数:

 python之有参装饰器_02

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

python之有参装饰器_02

 

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

python之有参装饰器_02

 

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

相关推荐