详解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

标签:python,装饰器
0
投稿

猜你喜欢

  • phpstorm断点调试方法图文详解

    2023-05-30 01:06:40
  • 解析如何用SQL语句在指定字段前面插入新的字段

    2024-01-24 12:18:36
  • mysql密码忘记怎么办

    2024-01-17 06:20:30
  • python如何实现单链表的反转

    2023-05-11 12:44:10
  • 谈谈网页设计中的字体应用 (1) Font Set

    2009-11-24 12:55:00
  • Python绘制股票移动均线的实例

    2023-07-15 10:31:06
  • python编写猜数字小游戏

    2021-01-14 11:18:40
  • 使用matplotlib中scatter方法画散点图

    2022-10-16 02:02:39
  • matplotlib画混淆矩阵与正确率曲线的实例代码

    2021-09-21 05:41:10
  • Python导入模块包原理及相关注意事项

    2023-01-26 04:46:31
  • Vue实现自带的过滤器实例

    2024-05-09 10:41:10
  • python内置函数之eval函数详解

    2022-07-22 12:39:29
  • js multiple全选与取消全选实现代码

    2024-04-28 10:19:36
  • python 匹配url中是否存在IP地址的方法

    2023-04-13 14:29:08
  • python字典进行运算原理及实例分享

    2023-02-16 14:17:14
  • JS 循环li添加点击事件 (闭包的应用)

    2024-04-10 10:48:45
  • pytorch 实现cross entropy损失函数计算方式

    2022-03-18 00:45:50
  • Python数据分析之PMI数据图形展示

    2022-06-19 07:18:23
  • Python安装selenium包详细过程

    2023-04-12 00:05:31
  • 基于Python实现的购物商城管理系统

    2021-08-27 15:06:43
  • asp之家 网络编程 m.aspxhome.com