python中如何实现一个装饰器

1.1 装饰器基本理论

装饰器:本质就是一个函数,为其他函数添加附加功能。装饰器=高阶函数+函数嵌套+闭包

装饰器两大原则:

1)不修改被修饰函数的源代码

2)不修改被修饰函数的调用(运行)方式

开放封闭原则:程序一旦上线,就不应该修改,一旦修改就核能产生不可预估的后果。

场景:给线上现在运行的程序,添加新的功能,比如计算一个函数的运行时间,例如:

 

接下来,我们通过一点一点的学习就能实现这个简单的需求。

 

1.2 高阶函数

1)高阶函数接收的参数是一个函数名

2)高阶函数的返回值是一个函数名

满足上面任意一个条件就可,称为高阶函数

 

 

 

1.3 函数嵌套

函数里面又定义一个或多个函数。

 

1.4 关于闭包可实现装饰器传参

闭包:在一个作用域里放入定义变量,相当于打了一个包

闭和包的概念

闭:封装变量的意思,最里层 就是name变量

包: 如下图,一个圈代表一个包,代表一层,

如图:

 

 

1.5 装饰器的基本实现

装饰器=高阶函数+闭包+函数嵌套

那么就先写一个框架:

 

以上代码也基本上满足了如下原则:

 高阶函数:传入的参数和返回的值都是函数

函数嵌套:函数里面还有函数

  包:在函数作用域里定义变量

同时也没有修改test的调用方式和代码。

 

但是代码24行,每次都需要定义,这不是我们想要的,所有就出现了一个小技巧——>@timmer #就相当于test=timmer(test)

 

1.6 为装饰器添加一个返回值

如果执行出现none需要为装饰器添加返回值 。

 

 

 

1.7 被修饰函数如果带参数怎么办?

因为传入参数的个数不确定,我们可以利用(*args,**kwargs)来作为装饰器的参数。

 

1.8 函数闭包为所有函数添加验证功能

拿京东举例,无论你需要进入自己的主页,还是需要返回自己的信息,都需要先登录。所有就要利用装饰器,给每一个函数添加一个功能。

 

1.9 函数闭包模拟session

大家有没有发现上面程序的一个问题?

每次调用不同的被修饰函数的时候,都需要重新输入用户名和密码。

解决方法:

在不利用cokkiesession的情况下,可以选择用全局变量来记录用户名和密码的状态。这样所有的位置都能找到这个全局变量记录的状态。

例如:current_dic={'username':None,'login':False}

记录用户名,以及登录状态。

构思:如果用户登录过并成功,会通过全局变量首先进行用户名username记录,以及用户状态login记录。

2.0 利用函数闭包实现可传参装饰器

 

通过闭包原理,即可实现给装饰器传参。内部函数可调用全局变量函数给自己传入参数。

 

场景:可选择DB类型传入不同的参数

 

posted on 2018-04-17 12:58  代呵呵 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/taichicho/p/8863529.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值