详解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字符串和文件操作常用函数分析
Apr 08 Python
在Python中使用mongoengine操作MongoDB教程
Apr 24 Python
在win和Linux系统中python命令行运行的不同
Jul 03 Python
Python实现全角半角字符互转的方法
Nov 28 Python
MAC中PyCharm设置python3解释器
Dec 15 Python
检测python爬虫时是否代理ip伪装成功的方法
Jul 12 Python
对Python生成器、装饰器、递归的使用详解
Jul 19 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
Oct 24 Python
python迭代器常见用法实例分析
Nov 22 Python
Python字典底层实现原理详解
Dec 18 Python
Python爬虫爬取微信朋友圈
Aug 06 Python
Django cookie和session的应用场景及如何使用
Apr 29 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/02/03 PHP
九个你必须知道而且又很好用的php函数和特点
2013/08/08 PHP
PHP判断字符串长度的两种方法很实用
2015/09/22 PHP
php+mysql实现无限级分类
2015/11/11 PHP
php 使用curl模拟登录人人(校内)网的简单实例
2016/06/06 PHP
PHP编程实现csv文件导入mysql数据库的方法
2017/04/29 PHP
Laravel 自动生成验证的实例讲解:login / logout
2019/10/14 PHP
javascript 新浪背投广告实现代码
2009/07/07 Javascript
获取网站跟路径的javascript代码(站点及虚拟目录)
2009/10/20 Javascript
jquery实现文本框鼠标右击无效以及不能输入的代码
2010/11/05 Javascript
Extjs4 GridPanel的主要配置参数详细介绍
2013/04/18 Javascript
javascript数组操作方法小结和3个属性详细介绍
2014/07/05 Javascript
ajax+jQuery实现级联显示地址的方法
2015/05/06 Javascript
jquery实现动态改变div宽度和高度
2015/05/08 Javascript
在Mac OS下使用Node.js的简单教程
2015/06/24 Javascript
基于JS实现EOS隐藏错误提示层代码
2016/04/25 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
2016/07/19 Javascript
vue2组件实现懒加载浅析
2017/03/29 Javascript
Angular.JS利用ng-disabled属性和ng-model实现禁用button效果
2017/04/05 Javascript
AngularJS 应用模块化的使用
2018/04/04 Javascript
JavaScript门道之标准库
2018/05/26 Javascript
JS高级技巧(简洁版)
2018/07/29 Javascript
node中的session的具体使用
2018/09/14 Javascript
js事件on动态绑定数据,绑定多个事件的方法
2018/09/15 Javascript
jQuery实现鼠标放置名字上显示详细内容气泡提示框效果的方法分析
2020/04/04 jQuery
微信小程序开发(三):返回上一级页面并刷新操作示例【页面栈】
2020/06/01 Javascript
js面向对象封装级联下拉菜单列表的实现步骤
2021/02/08 Javascript
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
python 数据类型强制转换的总结
2021/01/25 Python
日本动漫周边服饰销售网站:Atsuko
2019/12/16 全球购物
技校毕业生自荐信范文
2014/03/07 职场文书
优秀员工推荐信
2014/05/10 职场文书
优秀毕业生的求职信
2014/07/21 职场文书
美德少年事迹材料1000字
2014/08/21 职场文书
学校财务管理制度
2015/08/04 职场文书
Python os和os.path模块详情
2022/04/02 Python