详解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的内存泄漏及gc模块的使用分析
Jul 16 Python
在Python的setuptools框架下生成egg的教程
Apr 13 Python
python通过imaplib模块读取gmail里邮件的方法
May 08 Python
python使用htmllib分析网页内容的方法
May 08 Python
python如何读写csv数据
Mar 21 Python
获取python的list中含有重复值的index方法
Jun 27 Python
对python中xlsx,csv以及json文件的相互转化方法详解
Dec 25 Python
Python实现的在特定目录下导入模块功能分析
Feb 11 Python
Python3批量生成带logo的二维码方法
Jun 24 Python
python爬虫爬取幽默笑话网站
Oct 24 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
Dec 23 Python
pytorch中获取模型input/output shape实例
Dec 30 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
《忧国的莫里亚蒂》先导宣传图与STAFF公开
2020/03/04 日漫
PHP-Fcgi下PHP的执行时间设置方法
2013/08/02 PHP
浅谈PHP中foreach/in_array的使用
2015/11/02 PHP
PHP实现webshell扫描文件木马的方法
2017/07/31 PHP
win10下 php安装seaslog扩展的详细步骤
2020/12/04 PHP
两个DIV等高的JS的实现代码
2007/12/23 Javascript
jQuery live
2009/05/15 Javascript
javascript 冒泡排序 正序和倒序实现代码
2010/12/14 Javascript
基于jquery的滚动鼠标放大缩小图片效果
2011/10/27 Javascript
JavaScript中“过于”犀利地for/in循环使用示例
2013/10/22 Javascript
jQuery显示和隐藏 常用的状态判断方法
2015/01/29 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
2015/08/06 Javascript
一篇文章掌握RequireJS常用知识
2016/01/26 Javascript
BootStrap selectpicker
2016/06/20 Javascript
Kotlin学习第一步 kotlin语法特性
2017/05/25 Javascript
JQuery事件冒泡和默认行为代码实例
2020/05/13 jQuery
python搭建简易服务器分析与实现
2012/12/15 Python
Django框架中方法的访问和查找
2015/07/15 Python
基于Python实现的微信好友数据分析
2018/02/26 Python
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
2018/07/12 Python
Django中的ajax请求
2018/10/19 Python
python切片的步进、添加、连接简单操作示例
2019/07/11 Python
django中账号密码验证登陆功能的实现方法
2019/07/15 Python
python shutil文件操作工具使用实例分析
2019/12/25 Python
简述python&pytorch 随机种子的实现
2020/10/07 Python
捷克时尚网上商店:OTTO
2018/03/15 全球购物
艺术家策划的室内设计:Curious Egg
2019/03/06 全球购物
大门门卫岗位职责
2013/11/30 职场文书
大家访活动实施方案
2014/03/10 职场文书
学校安全教育月活动总结
2014/07/07 职场文书
2014年群众路线党员自我评议
2014/09/24 职场文书
关于童年的读书笔记
2015/06/26 职场文书
大学生读书笔记大全
2015/07/01 职场文书
六一儿童节致辞稿(3篇)
2019/07/11 职场文书
晶体管来复再生式二管收音机
2021/04/22 无线电
8个JS的reduce使用实例和reduce操作方式
2021/10/05 Javascript