详解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中的array数组模块相关使用
Jul 05 Python
python实现单线程多任务非阻塞TCP服务端
Jun 13 Python
速记Python布尔值
Nov 09 Python
Django1.9 加载通过ImageField上传的图片方法
May 25 Python
python的pip安装以及使用教程
Sep 18 Python
Django数据库连接丢失问题的解决方法
Dec 29 Python
Python实现的在特定目录下导入模块功能分析
Feb 11 Python
python钉钉机器人运维脚本监控实例
Feb 20 Python
Python爬虫工具requests-html使用解析
Apr 29 Python
python 使用递归的方式实现语义图片分割功能
Jul 16 Python
python 线程的五个状态
Sep 22 Python
OpenCV读取与写入图片的实现
Oct 13 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的全局错误处理详解
2016/04/25 PHP
PHP并发多进程处理利器Gearman使用介绍
2016/05/16 PHP
PHP Web表单生成器案例分析
2020/06/02 PHP
JS创建优美的页面滑动块效果 - Glider.js
2007/09/27 Javascript
使用jquery实现select添加实现后台权限添加的效果
2011/05/28 Javascript
一个简单的Ext.XTemplate的实例代码
2012/03/18 Javascript
String.prototype实现的一些javascript函数介绍
2013/11/22 Javascript
javascript快速排序算法详解
2014/09/17 Javascript
JavaScript编程的单例设计模讲解
2015/11/10 Javascript
JavaScript实现输入框(密码框)出现提示语
2016/01/12 Javascript
jQuery表格的维护和删除操作
2017/02/03 Javascript
理解nodejs的stream和pipe机制的原理和实现
2017/08/12 NodeJs
[js高手之路]HTML标签解释成DOM节点的实现方法
2017/08/31 Javascript
使用vuex的state状态对象的5种方式
2018/04/19 Javascript
详解如何提升JSON.stringify()的性能
2019/06/12 Javascript
使用apifm-wxapi快速开发小程序过程详解
2019/08/05 Javascript
JS面向对象编程实现的Tab选项卡案例详解
2020/03/03 Javascript
jQuery实现鼠标拖动图片功能
2021/03/04 jQuery
[03:48]显微镜下的DOTA2第四期——TP动作
2014/06/20 DOTA
简单说明Python中的装饰器的用法
2015/04/24 Python
python选择排序算法实例总结
2015/07/01 Python
python django事务transaction源码分析详解
2017/03/17 Python
Python3 操作符重载方法示例
2017/11/23 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
2018/04/21 Python
python3读取csv和xlsx文件的实例
2018/06/22 Python
pycharm 解除默认unittest模式的方法
2018/11/30 Python
Python PIL读取的图像发生自动旋转的实现方法
2019/07/05 Python
python flask几分钟实现web服务的例子
2019/07/26 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
2019/08/20 Python
基督教卡片、励志礼品、家居装饰等:DaySpring
2018/10/12 全球购物
音乐学院硕士生的自我评价分享
2013/11/01 职场文书
西柏坡导游词
2015/02/05 职场文书
2015年预防青少年违法犯罪工作总结
2015/05/22 职场文书
工作建议书范文
2019/07/08 职场文书
Elasticsearch 批量操作
2022/04/19 Python
Android 中的类文件和类加载器详情
2022/06/05 Java/Android