python装饰器

一切皆对象:

首先我们来理解下Python中的函数

def hi(a='qing'):

  return 'la'+a

print(hi())===========结果为:"la qing"

我们也可以把这个函数赋值给一个变量

bb=hi

注意:复制的时候没有使用小括号,因为我们并没有调用hi函数

只是把它放在bb变量里,(其实也就是bb和hi同时引用这个函数)

print(bb())===========结果为:"la qing"

del hi

print(hi())============结果会报错

print(bb())===========结果为:"la qing"

在函数中定义函数:

def hehe():

  print('现在在hehe函数中')

  def ha():

    print("做一个好学生")

  def yi():
    print("好好学习")

  ha()

  yi()

  print("hehe函数结束")

hehe()

输出结果为:

'现在在hehe函数中'

"做一个好学生"

"好好学习"

"hehe函数结束"

注意:ha()和yi()函数不能在外面调用,只能在hehe()函数里面调用。

从函数中返回函数

注意:我们在函数中返回的是greet和welcome,而不是greet()和welcome(),因为当你把一对小括号放在后面,这个函数就会执行,然而如果你不放括号在它后面,那它可以被到处传递,并且可以赋值给别的变量而不去执行它。

将函数作为参数传给另一个函数

下面写一个装饰器:

上面这种写法是比较容易理解的方式,下面通过@来实现

这个两个方法实现的功能是一样的,第一种只是对于装饰器理解的一个过度,工作中还是用@这种,简单明了就可以知道是一个装饰器

但是,当我们打印被装饰的函数名字时发现,函数名字已经改变,针对这种情况我们要把装饰器的函数部分做一些调整

@wraps接受一个函数来进行装饰,并加入了复制函数名称,注释文档,参数列表等等的功能。这可以让我们在装饰器里面访问在装饰之前的函数的属性。

 那么带参数的装饰器怎么写?

带参数的装饰器指的是被装饰的函数需要传参

分析如下:

既然被装饰的函数需要传参,那么在它执行的时候肯定要传参的,所以装饰器里面a_func(a,b)肯定要把参数写在里面了(因为此时函数已经执行)

那么最里面这个a_func函数,又是在外面一层的函数wrapTheFunction执行后才能执行,所以参数在wrapTheFunction函数里就要传进来(总结来说就是一层套一层)

从最里面的函数找出处,然后把最顶端里面加上参数,那么为什么不在最外层a_new_decorator(a_func)这里面加参数呢,因为这里面接收的是被装饰的函数

下面是代码:

如果传的参数是不定长参数,就把a,b换成*args,**kwargs

原文地址:https://www.cnblogs.com/daqingzi/p/9553217.html