详解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启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
Apr 09 Python
从CentOS安装完成到生成词云python的实例
Dec 01 Python
Python2.7 实现引入自己写的类方法
Apr 29 Python
dataframe 按条件替换某一列中的值方法
Jan 29 Python
python实现计数排序与桶排序实例代码
Mar 28 Python
python2.7的flask框架之引用js&css等静态文件的实现方法
Aug 22 Python
python中使用input()函数获取用户输入值方式
May 03 Python
Python如何用wx模块创建文本编辑器
Jun 07 Python
python脚本和网页有何区别
Jul 02 Python
全网最全python库selenium自动化使用详细教程
Jan 12 Python
python自动计算图像数据集的RGB均值
Jun 18 Python
bat批处理之字符串操作的实现
Mar 16 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数据库操作二:memcache用法分析
2017/08/16 PHP
图片上传即时显示缩略图的js代码
2009/05/27 Javascript
javascript appendChild,innerHTML,join性能比较代码
2009/08/29 Javascript
xml文档转换工具,附图表例子(hta)
2010/11/17 Javascript
Javascript判断对象是否相等实现代码
2013/03/18 Javascript
JS简单实现动画弹出层效果
2015/05/05 Javascript
JS选取DOM元素的简单方法
2016/07/08 Javascript
Js遍历键值对形式对象或Map形式的方法
2016/08/08 Javascript
Angular2 环境配置详细介绍
2016/09/21 Javascript
详解vee-validate的使用个人小结
2017/06/07 Javascript
VUE2实现事件驱动弹窗示例
2017/10/21 Javascript
vue-router实现组件间的跳转(参数传递)
2017/11/07 Javascript
JavaScript中的一些隐式转换和总结(推荐)
2017/12/22 Javascript
在React项目中使用Eslint代码检查工具及常见问题
2018/10/10 Javascript
jQuery的ztree仿windows文件新建和拖拽功能的实现代码
2018/12/05 jQuery
react组件从搭建脚手架到在npm发布的步骤实现
2019/01/09 Javascript
详解在React-Native中持久化redux数据
2019/05/22 Javascript
vue 使用外部JS与调用原生API操作示例
2019/12/02 Javascript
vue实现点击出现操作弹出框的示例
2020/11/05 Javascript
JavaScript实现鼠标移入随机变换颜色
2020/11/24 Javascript
[00:43]拉比克至宝魔导师密钥展示
2018/12/20 DOTA
Python学习小技巧之列表项的推导式与过滤操作
2017/05/20 Python
解决tensorflow模型参数保存和加载的问题
2018/07/26 Python
Python运行DLL文件的方法
2020/01/17 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
2020/01/18 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
2020/03/17 Python
jupyter notebook oepncv 显示一张图像的实现
2020/04/24 Python
CSS3 简单又实用的5个属性
2010/03/04 HTML / CSS
Html5写一个简单的俄罗斯方块小游戏
2019/12/03 HTML / CSS
RentCars.com巴西:汽车租赁网站
2016/08/22 全球购物
土木工程建筑专业毕业生求职信
2013/10/21 职场文书
自荐信的两点禁忌
2013/10/30 职场文书
有子女的离婚协议书怎么写(范本)
2014/09/29 职场文书
2015年端午节国旗下演讲稿
2015/03/19 职场文书
2015暑期工社会实践报告
2015/07/13 职场文书
带你了解Java中的ForkJoin
2022/04/28 Java/Android