一、函数装饰器
1、函数装饰器的定义:
装饰器的实现是函数里面嵌套函数
在不改变原函数的基础上,给函数增加功能",把一个函数当作参数,返回一个替代版的函数
本质上:返回函数的函数
装饰器需要传递一个函数, 返回值也是一个函数对象.
示例1:调用新函数
如下outer函数就是一个装饰器,func是形参接收的一个函数,inner是返回的函数
示例2:
2、语法糖:@+装饰器函数名(@desc)
使用装饰器来装饰一个函数,只需要在开头加上@+装饰器函数名就可以
运行结果如下:
3、导入string模块,使得我们可以调用与字符串操作相关的函数
4、装饰器需求:获取每个函数的执行时间
1.函数执行之前计算时间
2.函数执行之后计算时间
导入random模块和string模块,来生成100个大写或小写字母为元素组成的列表
运行结果如下:
问题1:被装饰的函数有返回值的时候怎么办?
python函数返回值return,函数中一定要有return才是完整的函数
#接收被装饰函数的返回值
res = fun(*args,**kwargs)
return res
运行结果为:
问题2:如何保留被装饰函数的函数名和帮助文档信息
导入import functools模块来保留被装饰函数的函数名和帮助文档信息
运行结果如下:
.__name__:用来记录函数的名称
.__doc__:用来记录函数的文档字符串
5、map和匿名函数
map( )传入的第一个参数是一个函数,第二个参数是一个序列
5、多个装饰器的顺序
一个函数的装饰器可以有对个,如果要使用多个装饰器,在函数的定义之前加上对应装饰器的语法糖就可以
多个装饰器的使用顺序:当有多个装饰器时,从下到上调用装饰器
运行结果为:
6、带有参数的装饰器
@log('westos')
log('westos') –> 返回值是add_log
add = add_log(add)
运行结果为:
二、装饰器练习
1、 创建装饰器, 要求如下:
1). 创建add_log装饰器, 被装饰的函数打印日志信息;
2). 日志格式为: [字符串时间] 函数名: xxx, 运行时间:xxx, 运行返回值结果:xxx
运行结果为:
2、需求:用户登陆验证的装饰器 is_login
1)如果用户登陆成功,则执行被装饰的函数
2)如果用户登陆不成功,则执行登陆函数
运行结果为:
3、编写装饰器required_ints, 条件如下:
1)确保函数接收到的每一个参数都是整数;
2) 如果参数不是整形数, 打印 TypeError:参数必须为整形
运行结果为:
4、多和装饰器的应用
在我们实际的应用场景中,会采用多个装饰器先验证是否登陆成功再验证权限
需求1:用户登陆验证的装饰器is_login
1)如果用户登陆成功,则执行被装饰的函数
2)如果用户登陆不成功,则显示未登陆信息
需求2:判断登陆用户是否是超级用户is_root
1)若是超级用户root,则执行装饰函数
2)若不是超级用户,则报错
运行结果为:
5、带有参数的装饰器练习
编写装饰器required_types, 条件如下:
1)当装饰器为@required_types(int,float)确保函数接收到的每一个参数都是int或者float类型;
2)当装饰器为@required_types(list)确保函数接收到的每一个参数都是list类型;
3)当装饰器为@required_types(str,int)确保函数接收到的每一个参数都是str或者int类型;
4)如果参数不满足条件, 打印 TypeError:参数必须为xxxx类型
运行结果为: