详解python中的装饰器
作者:孤月灵声 发布时间:2023-02-20 10:33:36
在了解装饰器之前,我们需要知道什么闭包是什么鬼!
闭包:在一个函数内定义了一个函数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中的装饰器网站的支持!
来源:https://www.cnblogs.com/wh-alan/p/9287434.html
猜你喜欢
- FTP即文件传输协议;它基于客户机-服务器模型体系结构,应用广泛。它有两个通道:一个命令通道和一个数据通道。命令通道用于控制通信,数据通道用
- 如何在ADO服务器端利用好缓存技术?请看下面示例,这是一个用来显示图书分类的例子程序:displayBooks.asp< %
- 导入相关包import timeimport pydashimport base64import requestsfrom lxml imp
- asp中怎么替换最后一个逗号为空字符串?举例 aaa,bbb,ccc,eee, 这个字符串怎么让最后一个逗号变没,其他的不变啊 ?问题补充:
- bytes 和 bytearraybytes 和 bytearray 都是二进制世界的成员,用二进制的方式去理解才能看清他的本质。理解byt
- isset($var); //为false 没有定义没有定义为假 $var = ''
- 看下面的例子就会明白了: print '|','*'.ljust(10),'|' print
- 今天在看框架的时候无意间看到了document.compatMode,经过一番资料查找,终于搞懂了。文档模式在开发中貌似很少用到,最常见的是
- IE8 的测试版发布,ACID 3 测试正式推出,听上去是让人兴奋的技术进步,而对中文互联网站却是极大的威胁:这意味着,超过半数的中文网页在
- 本文实例总结了php遍历目录方法。分享给大家供大家参考。具体如下:1. 方法1 <?p
- json_encode()如何转化一个对象? 使用 json_encode() 将数组 array
- MyISAM 是MySQL中默认的存储引擎,一般来说不是有太多人关心这个东西。决定使用什么样的存储引擎是一个很tricky的事情,但是还是值
- 除了在Matlab中使用PRTools工具箱中的svm算法,Python中一样可以使用支持向量机做分类。因为Python中的sklearn库
- 简介目前PHP实现web socket 都是使用框架集成来实现,比如hyperf,swoft,或者是安装swoole 扩展来实现websoc
- 1,FCKeditor 编辑器最新版本: 2.3.1站点:http://www.fckeditor.net 演示:http://w
- 14个超酷的js显示时间效果,一定有你想要的。正常时间显示运行效果图:<title>正常显示的时钟 - asp之家 - http
- 1. 问题使用PyCharm 创建完Django 项目 想登录admin 页面 却不知道用户名和密码。 用的默认sqlit2.解决办法2.1
- Yahoo!的Exceptional Performance团队为改善Web性能带来最佳实践。他们为此进行了一系列的实验、开发了
- 学习前言我发现不仅有很多的Keras模型,还有很多的PyTorch模型,还是学学Pytorch吧,我也想了解以下tensor到底是个啥。Py
- 附上代码与运行结果截图:import time# 获取当前时间now = time.localtime()# 格式化日期now_ = tim