一、函数装饰器 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类型 运行结果为: