1.1 装饰器基本理论
装饰器:本质就是一个函数,为其他函数添加附加功能。装饰器=高阶函数+函数嵌套+闭包
装饰器两大原则:
1)不修改被修饰函数的源代码
2)不修改被修饰函数的调用(运行)方式
开放封闭原则:程序一旦上线,就不应该修改,一旦修改就核能产生不可预估的后果。
场景:给线上现在运行的程序,添加新的功能,比如计算一个函数的运行时间,例如:
接下来,我们通过一点一点的学习就能实现这个简单的需求。
1.2 高阶函数
1)高阶函数接收的参数是一个函数名
2)高阶函数的返回值是一个函数名
满足上面任意一个条件就可,称为高阶函数
1.3 函数嵌套
函数里面又定义一个或多个函数。
1.4 关于闭包(可实现装饰器传参)
闭包:在一个作用域里放入定义变量,相当于打了一个包
闭和包的概念
闭:封装变量的意思,最里层 就是name变量
包: 如下图,一个圈代表一个包,代表一层,
如图:
1.5 装饰器的基本实现
装饰器=高阶函数+闭包+函数嵌套
那么就先写一个框架:
以上代码也基本上满足了如下原则:
高阶函数:传入的参数和返回的值都是函数
函数嵌套:函数里面还有函数
闭 包:在函数作用域里定义变量
同时也没有修改test的调用方式和代码。
但是代码24行,每次都需要定义,这不是我们想要的,所有就出现了一个小技巧——>@timmer #就相当于test=timmer(test)
1.6 为装饰器添加一个返回值
如果执行出现none需要为装饰器添加返回值 。
1.7 被修饰函数如果带参数怎么办?
因为传入参数的个数不确定,我们可以利用(*args,**kwargs)来作为装饰器的参数。
1.8 函数闭包为所有函数添加验证功能
拿京东举例,无论你需要进入自己的主页,还是需要返回自己的信息,都需要先登录。所有就要利用装饰器,给每一个函数添加一个功能。
1.9 函数闭包模拟session
大家有没有发现上面程序的一个问题?
每次调用不同的被修饰函数的时候,都需要重新输入用户名和密码。
解决方法:
在不利用cokkie和session的情况下,可以选择用全局变量来记录用户名和密码的状态。这样所有的位置都能找到这个全局变量记录的状态。
例如:current_dic={'username':None,'login':False}
记录用户名,以及登录状态。
构思:如果用户登录过并成功,会通过全局变量首先进行用户名username记录,以及用户状态login记录。
2.0 利用函数闭包实现可传参装饰器
通过闭包原理,即可实现给装饰器传参。内部函数可调用全局变量函数给自己传入参数。
场景:可选择DB类型传入不同的参数