详解python中的装饰器


Posted in Python onJuly 10, 2018

在了解装饰器之前,我们需要知道什么闭包是什么鬼!

闭包:在一个函数内定义了一个函数f,并且这个函数f引用外部变量,在把这个函数f当做返回值返回。

上述说了闭包的三个条件:

1 函数内定义了一个函数f

2 f函数引用了外部变量

3 f被当做返回值返回

def t1():#定义t1函数
 x=2
 def f():#t1函数内部定义了f函数
  print(x)#f函数引用了不属于自己内部的变量x
 return f #f被当做返回值返回

而装饰器有是什么鬼呢?其实闭包的一种运用。

装饰器:在不改变函数(当然还有其他的)的代码和调用方式的前提下,为函数增加新的功能!

那么需求来了:例如我定义了一个下载方法,我在想不改变下载方法的代码和调用方式,为其加一个需要登录后才能下载的功能

def get(file):#下载方法
 print('下载成功',file)

那么如何实现呢?这里就要用到上面提到的闭包。

我们再来看看闭包,即是在一个函数内定义了一个函数f,并且这个函数f引用外部变量,在把这个函数f当做返回值返回

那么上面的需求我们可以先试着做第一步,即是不改变下载方法的代码,为其加一个需要登录后才能下载的功能

def get(file):#下载方法
 print('下载成功',file)
def auth(get,*args,**kwargs):
 print('登录方法')
 get(*args,**kwargs)
auth(get,'a.txt')
#结果:
#登录方法
#下载成功 a.txt

但是这样的话调用方式改变了,那么我们可以利用闭包:

def get(file):#下载方法
 print('下载成功',file)
def func(get):
 def auth():
  print('登录方法')
  get()
 return auth
get=func(get)
get('dasd')

这样的话,参数有传不进去,并且报错参数没有接收到:

我们分析一下上面代码 func(get)其实应该是auth这函数名,那么get=func(get),就是把auth赋值给get变量,即是次数 get=auth,

那么 我们调用get('dasd') 即是auth('dasd'),即是我们需要修改auth函数

def get(file):#下载方法
 print('下载成功',file)
def func(get):
 def auth(file):
  print('登录方法')
  get(file)
 return auth
get=func(get)
get('dasd')

这样的话get('dasd')的时候就是调用auth('dasd'),那么会执行登录方法,并且执行get('dasd'),这里是真正的下载方法

优化一下就是这样的:

def auth(f):
 def wrapper(*args,**kwargs):
  print('其它功能或方法')
  f(*args,**kwargs)
 return wrapper

这样的要装饰get函数的时候,只需get=auth(get),这里第一个get是变量,第二个get是函数名,这样就实现get不改变其的代码和调用方式,为其增加功能。

在python中 get=auth(get),可以省略为:

def auth(f):
 def wrapper(*args,**kwargs):
  print('登录方法')
  f(*args,**kwargs)
 return wrapper
@auth # 相当于get=auth(get)
def get(file):#下载方法
 print('下载成功',file)

当然上面是装饰器的无参装饰器,还有有参装饰器:

#有参装饰器
def authx(a):
 def auth(f):
  def wrapper(*args, **kwargs):
   if a=='a':
    print('登录方法')
   else:
    print('adad')
   f(*args, **kwargs)
  return wrapper
 return auth

@authx('adas') # 相当于get=auth(get) 当然 a的值也传入了
def get(file):#下载方法
 print('下载成功',file)

总结

以上所述是小编给大家介绍的python中的装饰器,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
举例介绍Python中的25个隐藏特性
Mar 30 Python
Python守护进程用法实例分析
Jun 04 Python
python将每个单词按空格分开并保存到文件中
Mar 19 Python
python实现最长公共子序列
May 22 Python
Python实现的生产者、消费者问题完整实例
May 30 Python
python3中zip()函数使用详解
Jun 29 Python
python中scikit-learn机器代码实例
Aug 05 Python
python解析命令行参数的三种方法详解
Nov 29 Python
Numpy与Pytorch 矩阵操作方式
Dec 27 Python
Python要如何实现列表排序的几种方法
Feb 21 Python
tensorflow基于CNN实战mnist手写识别(小白必看)
Jul 20 Python
python爬虫之selenium库的安装及使用教程
May 23 Python
pandas值替换方法
Jul 10 #Python
Pandas 数据处理,数据清洗详解
Jul 10 #Python
python+pandas+时间、日期以及时间序列处理方法
Jul 10 #Python
使用Python的Dataframe取两列时间值相差一年的所有行方法
Jul 10 #Python
Python Dataframe 指定多列去重、求差集的方法
Jul 10 #Python
Python实现对文件进行单词划分并去重排序操作示例
Jul 10 #Python
python3中函数参数的四种简单用法
Jul 09 #Python
You might like
PHP中查询SQL Server或Sybase时TEXT字段被截断的解决方法
2009/03/10 PHP
php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
2015/04/14 PHP
WordPress中给文章添加自定义字段及后台编辑功能区域
2015/12/19 PHP
thinkphp命名空间用法实例详解
2015/12/30 PHP
详解WordPress中分类函数wp_list_categories的使用
2016/01/04 PHP
PHP常量define和const的区别详解
2019/05/18 PHP
jqPlot Option配置对象详解
2009/07/25 Javascript
两个select之间option的互相添加操作(jquery实现)
2009/11/12 Javascript
使用js获取QueryString的方法小结
2010/02/28 Javascript
jquery入门—编写一个导航条(可伸缩)
2013/01/07 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
浅谈javascript事件取消和阻止冒泡
2015/05/26 Javascript
node.js中格式化数字增加千位符的几种方法
2015/07/03 Javascript
JS实现生成会变大变小的圆环实例
2015/08/05 Javascript
JavaScript对象数组的排序处理方法
2015/10/21 Javascript
JS中input表单隐藏域及其使用方法
2017/02/13 Javascript
JS FormData上传文件的设置方法
2017/07/05 Javascript
webpack 2的react开发配置实例代码
2017/07/28 Javascript
bootstrap treeview 扩展addNode方法动态添加子节点的方法
2017/11/21 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
vue监听键盘事件的快捷方法【推荐】
2018/07/11 Javascript
vue中使用[provide/inject]实现页面reload的方法
2019/09/30 Javascript
vue中利用iscroll.js解决pc端滚动问题
2020/02/15 Javascript
基于JavaScript或jQuery实现网站夜间/高亮模式
2020/05/30 jQuery
纯Python开发的nosql数据库CodernityDB介绍和使用实例
2014/10/23 Python
浅谈python正则的常用方法 覆盖范围70%以上
2018/03/14 Python
Python代码实现删除一个list里面重复元素的方法
2019/04/02 Python
对Python3中列表乘以某一个数的示例详解
2019/07/20 Python
Tensorflow读取并输出已保存模型的权重数值方式
2020/01/04 Python
RIP版本1跟版本2的区别
2013/12/30 面试题
小学教师寄语大全
2014/04/03 职场文书
《三个小伙伴》教学反思
2014/04/11 职场文书
法人代表证明书
2014/09/18 职场文书
《草船借箭》教学反思
2016/02/23 职场文书
Python+uiautomator2实现自动刷抖音视频功能
2021/04/29 Python
vue 实现上传组件
2021/05/31 Vue.js