详解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解析中国天气网的天气数据
Mar 21 Python
零基础写python爬虫之使用urllib2组件抓取网页内容
Nov 04 Python
PyCharm使用教程之搭建Python开发环境
Jun 07 Python
Python的包管理器pip更换软件源的方法详解
Jun 20 Python
python3.5实现socket通讯示例(TCP)
Feb 07 Python
python计算两个数的百分比方法
Jun 29 Python
使用python绘制二维图形示例
Nov 22 Python
python关于变量名的基础知识点
Mar 03 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
Jul 03 Python
PyCharm Community安装与配置的详细教程
Nov 24 Python
使用BeautifulSoup4解析XML的方法小结
Dec 07 Python
pytorch 实现L2和L1正则化regularization的操作
Mar 03 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 REMOTE_ADDR之获取访客IP的代码
2008/04/22 PHP
PHP写杨辉三角实例代码
2011/07/17 PHP
关于PHP中Session文件过多的问题及session文件保存位置
2016/03/17 PHP
php打乱数组二维数组多维数组的简单实例
2016/06/17 PHP
php桥接模式应用案例分析
2019/10/23 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
2019/11/14 PHP
javascript语句中的CDATA标签的意义
2007/05/09 Javascript
表单项的name命名为submit、reset引起的问题
2007/12/22 Javascript
jquery tab插件精简版分享
2011/09/10 Javascript
javascript针对DOM的应用实例(一)
2012/04/15 Javascript
javascript if条件判断方法小结
2014/05/17 Javascript
jQuery实现复选框批量选择与反选的方法
2015/06/17 Javascript
javascript密码强度校验代码(两种方法)
2015/08/10 Javascript
完善的jquery处理机制
2016/02/21 Javascript
jQuery实现的浮动层div浏览器居中显示效果
2017/02/03 Javascript
JavaScript之创意时钟项目(实例讲解)
2017/10/23 Javascript
微信开发之企业付款到银行卡接口开发的示例代码
2018/09/18 Javascript
详解微信小程序网络请求接口封装实例
2019/05/02 Javascript
js定义类的方法示例【ES5与ES6】
2019/07/30 Javascript
vue实现用户长时间不操作自动退出登录功能的实现代码
2020/07/23 Javascript
python算法学习之基数排序实例
2013/12/18 Python
python处理json数据中的中文
2014/03/06 Python
python判断、获取一张图片主色调的2个实例
2014/04/10 Python
深入讲解Python中的迭代器和生成器
2015/10/26 Python
更换Django默认的模板引擎为jinja2的实现方法
2018/05/28 Python
tensorflow实现逻辑回归模型
2018/09/08 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
2018/12/05 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
python 实现的车牌识别项目
2021/01/25 Python
车库门开启器、遥控器和零件:Chamberlain
2019/04/09 全球购物
公司委托书格式
2014/08/01 职场文书
2015年教师师德师风承诺书
2015/04/28 职场文书
迁徙的鸟观后感
2015/06/09 职场文书
2016年清明节红领巾广播稿
2015/12/17 职场文书
《自己去吧》教学反思
2016/02/16 职场文书
vue项目中的支付功能实现(微信支付和支付宝支付)
2022/02/18 Vue.js