详解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 相关文章推荐
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
Apr 16 Python
python登录豆瓣并发帖的方法
Jul 08 Python
Python 实现 贪吃蛇大作战 代码分享
Sep 07 Python
深入理解NumPy简明教程---数组3(组合)
Dec 17 Python
Python文件的读写和异常代码示例
Oct 31 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
Jul 17 Python
sklearn-SVC实现与类参数详解
Dec 10 Python
利用python3 的pygame模块实现塔防游戏
Dec 30 Python
Python3 读取Word文件方式
Feb 13 Python
Python爬虫与反爬虫大战
Jul 30 Python
关于python中导入文件到list的问题
Oct 31 Python
OpenCV-Python实现人脸美白算法的实例
Jun 11 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
延长phpmyadmin登录时间的方法
2011/02/06 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
2014/06/19 PHP
PHP人民币金额转大写实例代码
2015/10/02 PHP
Smarty环境配置与使用入门教程
2016/05/11 PHP
PHP 中魔术常量的实例详解
2017/10/26 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
Jquery ajax不能解析json对象,报Invalid JSON错误的原因和解决方法
2010/03/27 Javascript
关于Jquery操作Cookie取值错误的解决方法
2013/08/26 Javascript
html文本框提示效果的示例代码
2014/06/28 Javascript
基于JavaScript实现生成名片、链接等二维码
2015/09/20 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
2015/12/17 Javascript
学习javascript面向对象 实例讲解面向对象选项卡
2016/01/04 Javascript
javascript类型系统_正则表达式RegExp类型详解
2016/06/24 Javascript
Jquery删除css属性的简单方法
2016/12/04 Javascript
jquery无法为动态生成的元素添加点击事件的解决方法(推荐)
2016/12/26 Javascript
jQuery实现的下雪动画效果示例【附源码下载】
2018/02/02 jQuery
微信小程序实现的日期午别医生排班表功能示例
2019/01/09 Javascript
vue-cli 项目打包完成后运行文件路径报错问题
2019/07/19 Javascript
[01:13]DOTA2群星解读国服召集令 一起说出回归的理由
2013/07/17 DOTA
[00:43]2016完美“圣”典风云人物:单车宣传片
2016/12/02 DOTA
python两种遍历字典(dict)的方法比较
2014/05/29 Python
git使用.gitignore设置不生效或不起作用问题的解决方法
2017/06/01 Python
Python OpenCV处理图像之滤镜和图像运算
2018/07/10 Python
Python2和Python3.6环境解决共存问题
2018/11/09 Python
python交互模式基础知识点学习
2020/06/18 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
2020/12/09 Python
HTML5添加鼠标悬浮音响效果不使用FLASH
2014/04/23 HTML / CSS
小摄影师教学反思
2014/04/27 职场文书
运动会方队口号
2014/06/07 职场文书
2014个人年度工作总结范文
2014/12/24 职场文书
2015年财务个人工作总结范文
2015/05/22 职场文书
感动中国何玥观后感
2015/06/02 职场文书
导游词书写之黄山
2019/08/06 职场文书
python实现剪贴板的操作
2021/07/01 Python
Go语言基础切片的创建及初始化示例详解
2021/11/17 Golang