详解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增量循环删除MySQL表数据的方法
Sep 23 Python
Django+JS 实现点击头像即可更改头像的方法示例
Dec 26 Python
在Pycharm中对代码进行注释和缩进的方法详解
Jan 20 Python
python里dict变成list实例方法
Jun 26 Python
让Python脚本暂停执行的几种方法(小结)
Jul 11 Python
python中的global关键字的使用方法
Aug 20 Python
python实现大量图片重命名
Mar 23 Python
TensorFlow2.0:张量的合并与分割实例
Jan 19 Python
Python OpenCV去除字母后面的杂线操作
Jul 05 Python
学生如何注册Pycharm专业版以及pycharm的安装
Sep 24 Python
Python numpy大矩阵运算内存不足如何解决
Nov 19 Python
python爬虫中采集中遇到的问题整理
Nov 27 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数组排序函数合集 以及它们之间的联系分析
2013/06/27 PHP
ThinkPHP模板替换与系统常量及应用实例教程
2014/08/22 PHP
微信第三方登录(原生)demo【必看篇】
2017/05/26 PHP
php 7新特性之类型申明详解
2017/06/06 PHP
基于jQuery的可以控制左右滚动及自动滚动效果的代码
2010/07/25 Javascript
jquery获取焦点和失去焦点事件代码
2013/04/21 Javascript
JS实现时间格式化的方式汇总
2013/10/16 Javascript
jquery中交替点击事件的实现代码
2014/02/14 Javascript
js使用post 方式打开新窗口
2015/02/26 Javascript
js实现鼠标移到链接文字弹出一个提示层的方法
2015/05/11 Javascript
用javascript实现自动输出网页文本
2015/07/30 Javascript
下雪了 javascript实现雪花飞舞
2020/08/02 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
解决vue 打包发布去#和页面空白的问题
2018/09/04 Javascript
使用ThinkJs搭建微信中控服务的实现方法
2019/08/08 Javascript
解决ele ui 表格表头太长问题的实现
2019/11/13 Javascript
[02:05]2014DOTA2西雅图国际邀请赛 BBC第二天小组赛总结
2014/07/11 DOTA
[49:31]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS BO3 第二场 1月29日
2021/03/11 DOTA
详解Python的Django框架中的Cookie相关处理
2015/07/22 Python
异步任务队列Celery在Django中的使用方法
2018/06/07 Python
python基于C/S模式实现聊天室功能
2019/01/09 Python
Python3 导入上级目录中的模块实例
2019/02/16 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
2020/05/20 Python
PyQt5实现登录页面
2020/05/30 Python
Python系统公网私网流量监控实现流程
2020/11/23 Python
哥伦比亚最大的网上商店:Linio哥伦比亚
2016/09/25 全球购物
Mamas & Papas沙特阿拉伯:英国最受欢迎的婴儿品牌
2017/11/20 全球购物
英国顶级珠宝品牌之家:John Greed
2018/06/09 全球购物
英国领先的在线鱼贩:The Fish Society
2020/08/12 全球购物
Penhaligon’s英国官网:成立于1870年的英国香水制造商
2021/02/18 全球购物
DBA数据库管理员JAVA程序员架构师必看
2016/02/07 面试题
工程部经理岗位职责
2013/12/08 职场文书
校园网站的创业计划书范文
2013/12/30 职场文书
党员活动日总结
2014/05/05 职场文书
群众路线教育实践活动思想汇报(2014特荐篇)
2014/09/16 职场文书