详解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实现提取谷歌音乐搜索结果的方法
Jul 10 Python
python机器学习实战之树回归详解
Dec 20 Python
TensorFlow入门使用 tf.train.Saver()保存模型
Apr 24 Python
Python使用pydub库对mp3与wav格式进行互转的方法
Jan 10 Python
基于python实现KNN分类算法
Apr 23 Python
在Pycharm中使用GitHub的方法步骤
Jun 13 Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
Jul 04 Python
Pytorch 数据加载与数据预处理方式
Dec 31 Python
在Mac中PyCharm配置python Anaconda环境过程图解
Mar 11 Python
python urllib和urllib3知识点总结
Feb 08 Python
解决numpy数组互换两行及赋值的问题
Apr 17 Python
Python 如何实现文件自动去重
Jun 02 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
第二节 对象模型 [2]
2006/10/09 PHP
PHP 搜索查询功能实现
2016/11/29 PHP
ThinkPHP5&5.1实现验证码的生成、使用及点击刷新功能示例
2020/02/07 PHP
利用PHP计算有多少小于当前数字的数字方法示例
2020/08/26 PHP
jquery tools 系列 scrollable(2)
2009/09/06 Javascript
Javascript UrlDecode函数代码
2010/01/09 Javascript
有关于JS构造函数的重载和工厂方法
2013/04/07 Javascript
javascript jq 弹出层实例
2013/08/25 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
搭建pomelo 开发环境
2014/06/24 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
JavaScript设计模式之外观模式介绍
2014/12/28 Javascript
NodeJS中Buffer模块详解
2015/01/07 NodeJs
基于javascript简单实现对身份证校验
2021/01/25 Javascript
jQuery实现拖动效果的实例代码
2017/06/25 jQuery
vue中Axios的封装与API接口的管理详解
2018/08/09 Javascript
layui type2 通过url给iframe子页面传值的例子
2019/09/06 Javascript
vue简单封装axios插件和接口的统一管理操作示例
2020/02/02 Javascript
js 动态校验开始结束时间的实现代码
2020/05/25 Javascript
如何区分vue中的v-show 与 v-if
2020/09/08 Javascript
解决vue页面刷新,数据丢失的问题
2020/11/24 Vue.js
element 动态合并表格的步骤
2020/12/31 Javascript
[51:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第二局
2016/03/03 DOTA
Python对小数进行除法运算的正确方法示例
2014/08/25 Python
python机器学习理论与实战(四)逻辑回归
2018/01/19 Python
Python 日志logging模块用法简单示例
2019/10/18 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
html5手机键盘弹出收起的处理
2020/01/20 HTML / CSS
error和exception有什么区别
2012/10/02 面试题
优秀共产党员先进事迹材料
2014/05/06 职场文书
人口与计划生育目标管理责任书
2014/07/29 职场文书
2014银行授权委托书样本
2014/10/04 职场文书
2015年上半年党建工作总结
2015/03/30 职场文书
地道战观后感
2015/06/04 职场文书
责任书格式
2019/04/18 职场文书
红灯733-1型14管5波段半导体收音机
2021/04/22 无线电