详解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字典多条件排序方法实例
Jun 30 Python
pandas实现选取特定索引的行
Apr 20 Python
python实现log日志的示例代码
Apr 28 Python
Python中的heapq模块源码详析
Jan 08 Python
在Python文件中指定Python解释器的方法
Feb 18 Python
Python使用sax模块解析XML文件示例
Apr 04 Python
libreoffice python 操作word及excel文档的方法
Jul 04 Python
python绘制彩虹图
Dec 16 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
Feb 25 Python
基于python实现检索标记敏感词并输出
May 07 Python
Python2.6版本pip安装步骤解析
Aug 17 Python
python playwright 自动等待和断言详解
Nov 27 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
PHPUnit PHP测试框架安装方法
2011/03/23 PHP
探讨Hessian在PHP中的使用分析
2013/06/13 PHP
关于PHP内存溢出问题的解决方法
2013/06/25 PHP
PHP中unset,array_splice删除数组中元素的区别
2014/07/28 PHP
Linux下安装PHP MSSQL扩展教程
2014/10/24 PHP
经典PHP加密解密函数Authcode()修复版代码
2015/04/05 PHP
php基于curl扩展制作跨平台的restfule 接口
2015/05/11 PHP
jQuery入门第一课 jQuery选择符
2010/03/14 Javascript
window.name代替cookie的实现代码
2010/11/28 Javascript
javascript:文字不间断向左移动的实例代码
2013/08/08 Javascript
jquery ajax请求方式与提示用户正在处理请稍等
2014/09/01 Javascript
JS实现点击颜色块切换指定区域背景颜色的方法
2015/02/25 Javascript
jquery中cookie用法实例详解(获取,存储,删除等)
2016/01/04 Javascript
js HTML5 Canvas绘制转盘抽奖
2020/09/13 Javascript
基于MVC方式实现三级联动(JavaScript)
2017/01/23 Javascript
利用nvm管理多个版本的node.js与npm详解
2017/11/02 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
2018/04/01 Javascript
Electron-vue脚手架改造vue项目的方法
2018/10/22 Javascript
详解关于element el-button使用$attrs的一个注意要点
2018/11/09 Javascript
JS/jQuery实现获取时间的方法及常用类完整示例
2019/03/07 jQuery
Nodejs监控事件循环异常示例详解
2019/09/22 NodeJs
小程序api实现promise封装过程解析
2019/11/21 Javascript
在vue中实现echarts随窗体变化
2020/07/27 Javascript
[06:57]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD 选手采访
2021/03/11 DOTA
浅谈Selenium+Webdriver 常用的元素定位方式
2021/01/13 Python
蒂芙尼澳大利亚官方网站:Tiffany&Co. Australia
2017/08/27 全球购物
TCP/IP中的TCP和IP分别承担什么责任
2012/04/21 面试题
销售类个人求职信范文
2013/09/25 职场文书
学生就业推荐信
2013/11/13 职场文书
团员的自我评价
2013/12/01 职场文书
家庭财产分割协议书范本
2014/11/24 职场文书
罚站检讨书
2015/01/29 职场文书
学校国庆节活动总结
2015/03/23 职场文书
售后服务质量承诺书
2015/04/29 职场文书
2015年管理人员工作总结
2015/05/13 职场文书
聘任协议书(挂靠)
2015/09/21 职场文书