一、装饰器:
######装饰器的定义
在不改变原函数的基础上,给函数增加功能,把一个函数当作参数,返回一个替代版的函数
本质上:返回函数的函数
######装饰器的概念
- 装饰器的实现是函数里面嵌套函数;
- 装饰器的本质是一个函数, 它可以让其他函数在不需要做任何代码改动的前提下增加额外的功能;
- 装饰器需要传递一个函数, 返回值也是一个函数对象.
######装饰器的组成:
< 函数+实参高阶函数+返回值高阶函数+嵌套函数+语法糖 = 装饰器 >
例1:
例2:
注:装饰器的应用场景
- 计时器
- 记录日志
- 用户登录验证
- 函数参数验证
二、语法糖
装饰符@类型于回调函数,只需在开头加上@+装饰器函数名就可以,把其它的函数作为自己的入参,在目的函数执行前,执行自己的操作然后返回目的函数
例1:
例2:
三、带参数的装饰器
functools模块:用于高阶函数:作用于或者返回其他函数的函数
四、带有多个装饰器的顺序
一个函数的装饰器可以有多个,如果要使用多个装饰器,在函数的定义之前加上对应装饰器的语法糖则可
五、多个装饰器的应用
在我们实际的应用场景中,会采用多个装饰器先验证是否登陆成功再验证权限
六、装饰器的用法
需求:用户登陆验证的装饰器 is_login
1)如果用户登陆成功,则执行被装饰的函数
2)如果用户登陆不成功,则执行登陆函数
七、装饰器练习
1.
装饰器需求:获取每个函数的执行时间
1)函数执行之前计算时间
2)函数执行之后计算时间
问题1:被装饰的函数有返回值的时候怎么办
######接收被装饰函数的返回值
res = fun(*args,**kwargs)
return res
问题2:如何保留被装饰函数的函数名和帮助文档信息
######导入import functools模块来保留被装饰函数的函数名和帮助文档信息
2.
创建装饰器, 要求如下:
1) 创建add_log装饰器, 被装饰的函数打印日志信息;
2)日志格式为: [字符串时间] 函数名: xxx, 运行时间:xxx, 运行返回值结果:xxx
3.
编写装饰器required_ints, 条件如下:
1)确保函数接收到的每一个参数都是整数;
2)如果参数不是整形数, 打印 TypeError:参数必须为整形
4.
编写装饰器required_types, 条件如下:
1). 当装饰器为@required_types(int,float)确保函数接收到的每一个参数都是int或者float类型;
2). 当装饰器为@required_types(list)确保函数接收到的每一个参数都是list类型;
3). 当装饰器为@required_types(str,int)确保函数接收到的每一个参数都是str或者int类型;
4). 如果参数不满足条件, 打印 TypeError:参数必须为xxxx类型