zoukankan      html  css  js  c++  java
  • 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基础(二)之数据类型和运算(6)——元组
    Python基础(二)之数据类型和运算(5)——字符串操作汇总
    Python基础(二)之数据类型和运算(4)—— 列表
    Python基础(二)之数据类型和运算(3)——其他运算算符
    Python 基础(三)——流程控制之break 、continue 、else
    Python 基础(三)之流程控制(3)——for
    Python 基础(三)之流程控制(2)——while
    Python 基础(三)之流程控制(1)——if…else
    python------迭代器与生成器
    Python基础(四)
  • 原文地址:https://www.cnblogs.com/haibaiwuchang/p/13264311.html
Copyright © 2011-2022 走看看