在了解装饰器之前,我们需要知道什么闭包是什么鬼!

闭包:在一个函数内定义了一个函数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)

本文作者:孤月灵声原文链接:https://www.cnblogs.com/wh-alan/p/9287434.html

python装饰器-究竟什么是装饰器?python中的装饰器介绍相关推荐

  1. jdk类加载器执行步骤_[JDK 11] jcmd中的类加载器层次结构详细信息

    jdk类加载器执行步骤 自从在JavaOne 2012上听说 jcmd以来,我就一直是命令行诊断工具jcmd的 粉丝 . 从那时起,我已经广泛使用了此工具,并多次在此博客中发布过此工具: jcmd:一 ...

  2. vue面向切面_vue:在路由跳转中使用拦截器

    1:首先在路由对象中的某一个具体的路由对象加这样一个属性 meta: {  requireAuth:true  } 2:然后在main.js中添加这段代码 router.beforeEach((to, ...

  3. 【SpringMVC学习11】SpringMVC中的拦截器

    Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理.本文主要总结一下springmvc中拦截器是如何定义的,以及测试拦截器的执行情况和使用 ...

  4. java类包装器有什么用_Java中的包装器类

    java类包装器有什么用 Wrapper class in java are the Object representation of eight primitive types in java. A ...

  5. python list 平均值_python list 最大值和平均值Python基础 - 文件拷贝

    最近在备份手机上的照片的时候,纯手工操作觉得有些麻烦,就想写个脚本自动进行.因为备份的时候有些照片以前备份过了,所以需要有个判重操作. 主要功能在copyFiles()函数里实现,如下: 电脑技术网认 ...

  6. python装饰器是什么意思_对Python装饰器的理解

    想要弄明白装饰器是什么东西,首先我们需要了解一下什么是闭包,因为装饰器是闭包的一种应用. 闭包 闭包的定义: ​通俗的来说闭包就是在一个函数内部定义另外一个函数,这个函数又引用了外部函数的变量,并且外 ...

  7. python 装饰器 参数-python函数装饰器之带参数的函数和带参数的装饰器用法示例...

    本文实例讲述了python函数装饰器之带参数的函数和带参数的装饰器用法.分享给大家供大家参考,具体如下: 1. 函数带多个参数 # 普通的装饰器, 打印函数的运行时间 def decrator(fun ...

  8. python中的装饰器有哪些-python 装饰器以及开发中常用的例子

    有时候我们想为多个函数,同意添加某一种功能,比如及时统计,记录日志,缓存运算结果等等,而又不想改变函数代码 那就定义装饰器函数,用它来生成一个在原函数基础添加了新功能的函数,代替原函数 参考金角大王的 ...

  9. python装饰器原理-python 中的装饰器及其原理

    装饰器模式 此前的文章中我们介绍过装饰器模式: 装饰器模式中具体的 Decorator 实现类通过将对组建的请求转发给被装饰的对象,并在转发前后执行一些额外的动作来修改原有的部分行为,实现增强 Com ...

  10. python装饰器-如何更通俗地讲解Python的装饰器?

    我从以下几点,由浅入深详细讲解一下Python装饰器:什么是装饰器? 为什么用装饰器? 在哪里用装饰器? 然后以示例+讲解相结合的方式阐述,同时会讲解一些在很多教程和书籍中不会涉及到的内容. 什么是P ...

最新文章

  1. html form提交前验证,form表单提交前验证实现方法
  2. mongodb - 前端form表单数据传输,在保存和清除的数据格式的处理程序的 - 非递归...
  3. 【Linux系统编程】进程间通信之消息队列
  4. 又有大动作?Pokémon Go开发商Niantic收购AR开发平台8th Wall,达成迄今为止金额最大的一笔收购
  5. QT之tableWidget删除全部行
  6. HiJson简要说明
  7. 半导体物理学习札记1
  8. 室内环境空气质量监测系统
  9. 软考知识点笔记之----项目范围说明书
  10. HDoj 1862
  11. Java:关于“StringBuilder“的运用
  12. C - Make Good(构造,思维)
  13. keep行走和计步_KEEP跑步计步器
  14. 颜色类中英文词汇大全(2)
  15. 微信5.0 Android版飞机大战破解无敌模式手记
  16. swift单元测试(三)XCTest之UI测试UITest
  17. 论文阅读:Tube Convolutional Neural Network (T-CNN) for Action Detection in Videos
  18. xfs_repair命令详解
  19. 模拟easeljs做动画
  20. 用可编程逻辑器件FPGA LCMXO2-4000HC-6MG132I 实现智能汽车解决方案设计

热门文章

  1. DataGridView 分页显示
  2. Linux下的一些问题收集及解决方法(二)
  3. [LeetCode] Search Insert Position 搜索插入位置
  4. Windows 7系统如何设置锁定计算机快捷方式【技术小摘】
  5. 【TDS学习笔记】Install the Web Admin Tool for TDS
  6. 将输入的中文按要求翻译成拼音
  7. RocksDB线程局部缓存
  8. Asp.net系列--基础篇(一)
  9. Spark你需要知道这些
  10. (2.4)备份与还原--WAL与备份原理