python中的函数装饰器

一、函数装饰器

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类型

运行结果为:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值