详解python中的装饰器

yipeiwu_com5年前Python基础

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

闭包:在一个函数内定义了一个函数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 实现判断ip连通性的方法总结

python 以下是个人学习 python 研究判断ip连通性方法的集合。 缺点可能有办法解决,如有错误,欢迎矫正。 方法一 import os return1=os.system(...

解决Tensorflow安装成功,但在导入时报错的问题

在Mac上按照官网教程安装成功tensor flow后,但在程序中导入时,仍然报错,包括但不限于以下两个错误。对于这种错误,原因主要在于Mac内默认的python库比较老了,即便通过pi...

python的schedule定时任务模块二次封装方法

通过定时来执行任务,我们日常工作生活中会经常用到。python有schedule这个库,简单好用,比如,可以每秒,每分,每小时,每天,每天的某个时间点,间隔天数的某个时间点定时执行,另外...

详解python项目实战:模拟登陆CSDN

详解python项目实战:模拟登陆CSDN

前言 今天为大家介绍一个利用Python模拟登陆CSDN的案例,虽然看起来很鸡肋,有时候确会有大用处,在这里就当做是一个案例练习吧,提高自己的代码水平,也了解Python如何做到模拟登陆...

使用PyCharm配合部署Python的Django框架的配置纪实

使用PyCharm配合部署Python的Django框架的配置纪实

安装软件 安装 Python 2.7、PyCharm、pip(Python包管理工具)、Django ( pip install Django) 部署 PyCharm 新建Django工...