详解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功能键的读取方法
May 28 Python
[原创]python爬虫(入门教程、视频教程)
Jan 08 Python
Python学生成绩管理系统简洁版
Apr 05 Python
使用python 3实现发送邮件功能
Jun 15 Python
python实现狄克斯特拉算法
Jan 17 Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
Aug 12 Python
pytorch 中pad函数toch.nn.functional.pad()的用法
Jan 08 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
Mar 08 Python
python实现FTP文件传输的方法(服务器端和客户端)
Mar 20 Python
django数据模型中null和blank的区别说明
Sep 02 Python
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
May 28 Python
Python+Appium自动化测试的实战
Jun 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
全国FM电台频率大全 - 1 北京市
2020/03/11 无线电
php常见的魔术方法详解
2014/12/25 PHP
php封装的数据库函数与用法示例【参考thinkPHP】
2016/11/08 PHP
PHP关于foreach复制知识点总结
2019/01/28 PHP
js鼠标及对象坐标控制属性详细解析
2013/12/14 Javascript
一个判断抢购时间是否到达的简单的js函数
2014/06/23 Javascript
BAT及各大互联网公司2014前端笔试面试题--JavaScript篇
2014/10/29 Javascript
node.js中的http.response.end方法使用说明
2014/12/14 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
微信小程序 Tab页切换更新数据
2017/01/05 Javascript
bootstrap table表格客户端分页实例
2017/08/07 Javascript
jQuery实现的自定义轮播图功能详解
2018/12/28 jQuery
了解在JavaScript中将值转换为字符串的5种方法
2019/06/06 Javascript
使用JS实现鼠标放上图片进行放大离开实现缩小功能
2021/01/27 Javascript
[58:12]Ti4第二日主赛事败者组 LGD vs iG 3
2014/07/21 DOTA
python list使用示例 list中找连续的数字
2014/01/27 Python
Python 实现一个颜色色值转换的小工具
2016/12/06 Python
python smtplib模块实现发送邮件带附件sendmail
2018/05/22 Python
使用python实现抓取腾讯视频所有电影的爬虫
2019/04/15 Python
零基础使用Python读写处理Excel表格的方法
2019/05/02 Python
python多进程读图提取特征存npy
2019/05/21 Python
python flask 如何修改默认端口号的方法步骤
2019/07/12 Python
python爬取盘搜的有效链接实现代码
2019/07/20 Python
Django中提示消息messages的设置方式
2019/11/15 Python
django models里数据表插入数据id自增操作
2020/07/15 Python
Python 如何定义匿名或内联函数
2020/08/01 Python
语文教育专业应届生求职信
2013/11/23 职场文书
国贸类专业毕业生的求职信分享
2013/12/08 职场文书
大学生的四年学习自我评价
2013/12/13 职场文书
技校毕业生的自我评价
2013/12/27 职场文书
党的群众路线教育实践活动组织生活会发言材料
2014/10/17 职场文书
2015年学校德育工作总结
2015/04/22 职场文书
承兑汇票延期证明
2015/06/23 职场文书
大学同学聚会感言
2015/07/30 职场文书
2016年社区国庆节活动总结
2016/04/01 职场文书
零基础学java之方法的定义与调用详解
2022/04/10 Java/Android