详解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入门篇之编程习惯与特点
Oct 17 Python
学习python类方法与对象方法
Mar 15 Python
Python实现HTTP协议下的文件下载方法总结
Apr 20 Python
Python中在脚本中引用其他文件函数的实现方法
Jun 23 Python
django轻松使用富文本编辑器CKEditor的方法
Mar 30 Python
Python获取当前页面内所有链接的四种方法对比分析
Aug 19 Python
python下10个简单实例代码
Nov 15 Python
python解析html提取数据,并生成word文档实例解析
Jan 22 Python
python日期与时间戳的各种转换示例
Feb 12 Python
浅谈Python的方法解析顺序(MRO)
Mar 05 Python
vscode+PyQt5安装详解步骤
Aug 12 Python
python字符串的多行输出的实例详解
Jun 08 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数据库操作之基于Mysqli的数据库操作类库
2014/04/19 PHP
让ThinkPHP的模板引擎达到最佳效率的方法详解
2017/03/14 PHP
php无限级评论嵌套实现代码
2018/04/18 PHP
JavaScript入门学习书籍推荐
2008/06/12 Javascript
传递参数的标准方法(jQuery.ajax)
2008/11/19 Javascript
异步动态加载js与css文件的js代码
2013/09/15 Javascript
jquery插件开发之实现jquery手风琴功能分享
2014/03/10 Javascript
ExtJS4 动态生成的grid导出为excel示例
2014/05/02 Javascript
简介JavaScript中的getSeconds()方法的使用
2015/06/10 Javascript
JQuery实现超链接鼠标提示效果的方法
2015/06/10 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
2015/11/24 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
微信小程序 图片绝对定位(背景图片)
2017/04/05 Javascript
jquery Form轻松实现文件上传
2017/05/24 jQuery
微信小程序 密码输入(源码下载)
2017/06/27 Javascript
Vue中父组件向子组件通信的方法
2017/07/11 Javascript
JS实现点击拉拽轮播图pc端移动端适配
2018/09/05 Javascript
electron实现静默打印的示例代码
2019/08/12 Javascript
jQuery实现可编辑的表格
2019/12/11 jQuery
uni-app实现获取验证码倒计时功能
2020/11/01 Javascript
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
Python计算三角函数之asin()方法的使用
2015/05/15 Python
Python使用ntplib库同步校准当地时间的方法
2016/07/02 Python
django开发教程之利用缓存文件进行页面缓存的方法
2017/11/10 Python
详解Django 中是否使用时区的区别
2018/06/14 Python
python爱心表白 每天都是浪漫七夕!
2018/08/18 Python
Python操作redis和mongoDB的方法
2019/12/19 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
2019/12/23 Python
小天鹅官方商城:LittleSwan
2017/06/16 全球购物
Kate Spade澳大利亚官方网站:美国设计师手袋品牌
2019/09/10 全球购物
英文版网络工程师求职信
2013/10/28 职场文书
给学校的建议书
2014/03/12 职场文书
文体活动总结范文
2014/05/05 职场文书
精神文明建设先进个人事迹材料
2014/12/24 职场文书
html5移动端禁止长按图片保存的实现
2021/04/20 HTML / CSS
MySql子查询IN的执行和优化的实现
2021/08/02 MySQL