python中的装饰器是干嘛的-究竟什么是装饰器?python中的装饰器介绍

本文详细介绍了Python中的闭包和装饰器概念。闭包是指在函数内部定义并引用外部变量的函数,作为返回值返回。装饰器则是闭包的一种应用,用于在不改变原函数代码和调用方式的情况下,为函数添加额外功能。文中通过实例展示了如何使用闭包实现登录验证功能,并逐步演化成装饰器的实现方式,包括无参和有参装饰器的使用。
摘要由CSDN通过智能技术生成

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值