python装饰器

一、装饰器:

######装饰器的定义

在不改变原函数的基础上,给函数增加功能,把一个函数当作参数,返回一个替代版的函数
本质上:返回函数的函数

######装饰器的概念
- 装饰器的实现是函数里面嵌套函数;
- 装饰器的本质是一个函数, 它可以让其他函数在不需要做任何代码改动的前提下增加额外的功能;
- 装饰器需要传递一个函数, 返回值也是一个函数对象.

######装饰器的组成:

 

< 函数+实参高阶函数+返回值高阶函数+嵌套函数+语法糖 = 装饰器 >

例1:

 

例2:

 

注:装饰器的应用场景
       - 计时器
       - 记录日志
       - 用户登录验证
       - 函数参数验证

二、语法糖

装饰符@类型于回调函数,只需在开头加上@+装饰器函数名就可以,把其它的函数作为自己的入参,在目的函数执行前,执行自己的操作然后返回目的函数

 

例1:

 

例2:

 

三、带参数的装饰器

  functools模块:用于高阶函数:作用于或者返回其他函数的函数



 

四、带有多个装饰器的顺序

一个函数的装饰器可以有多个,如果要使用多个装饰器,在函数的定义之前加上对应装饰器的语法糖则可

五、多个装饰器的应用

在我们实际的应用场景中,会采用多个装饰器先验证是否登陆成功再验证权限

需求1:用户登陆验证的装饰器is_login

              1)如果用户登陆成功,则执行被装饰的函数

               2)如果用户登陆不成功,则显示未登陆信息

需求2:判断登陆用户是否是超级用户is_root

              1)若是超级用户root,则执行装饰函数

              2)若不是超级用户,则报错

 

六、装饰器的用法

需求:用户登陆验证的装饰器 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类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值