详解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错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
Aug 22 Python
python中OrderedDict的使用方法详解
May 05 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
May 22 Python
Scrapy框架使用的基本知识
Oct 21 Python
Python中对数组集进行按行打乱shuffle的方法
Nov 08 Python
python 模拟银行转账功能过程详解
Aug 06 Python
python tkinter图形界面代码统计工具
Sep 18 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
Feb 09 Python
python 操作mysql数据中fetchone()和fetchall()方式
May 15 Python
15个Pythonic的代码示例(值得收藏)
Oct 29 Python
Django 权限管理(permissions)与用户组(group)详解
Nov 30 Python
python opencv旋转图片的使用方法
Jun 04 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中的函数嵌套层数限制分析
2011/06/13 PHP
PHP学习笔记 IIS7下安装配置php环境
2012/10/29 PHP
php外部执行命令函数用法小结
2016/10/11 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
PHP token验证生成原理实例分析
2019/06/05 PHP
jquery.lazyload  实现图片延迟加载jquery插件
2010/02/06 Javascript
JS创建自定义表格具体实现
2014/02/11 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
2014/09/23 Javascript
Javascript中prototype属性实现给内置对象添加新的方法
2015/05/14 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
2015/05/25 Javascript
Jquery组件easyUi实现选项卡切换示例
2016/08/23 Javascript
AngularJS入门教程之Helloworld示例
2016/12/25 Javascript
Bootstrap禁用响应式布局的实现方法
2017/03/09 Javascript
Angularjs为ng-click事件传递参数
2017/06/15 Javascript
javascript cookie的基本操作(添加和删除)
2017/07/24 Javascript
详解浏览器缓存和webpack缓存配置
2018/07/06 Javascript
原生JS 实现的input输入时表格过滤操作示例
2019/08/03 Javascript
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
JS实现骰子3D旋转效果
2019/10/24 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
Python 初始化多维数组代码
2008/09/06 Python
Python3实现的腾讯微博自动发帖小工具
2013/11/11 Python
Python转换HTML到Text纯文本的方法
2015/01/15 Python
Python登录并获取CSDN博客所有文章列表代码实例
2017/12/28 Python
浅谈Scrapy框架普通反爬虫机制的应对策略
2017/12/28 Python
python爬取m3u8连接的视频
2018/02/28 Python
PyQt5每天必学之组合框
2018/04/20 Python
在python中利用GDAL对tif文件进行读写的方法
2018/11/29 Python
Python计算不规则图形面积算法实现解析
2019/11/22 Python
pycharm不能运行.py文件的解决方法
2020/02/12 Python
Pytorch 使用CNN图像分类的实现
2020/06/16 Python
Python3+selenium配置常见报错解决方案
2020/08/28 Python
网易微博Web App用HTML5开发的过程介绍
2012/06/13 HTML / CSS
实例讲解使用SVG制作loading加载动画的方法
2016/04/05 HTML / CSS
工商企业管理实习自我鉴定
2013/12/04 职场文书
教师求职自荐信
2015/03/26 职场文书