原文地址
https:nolon.xyz
在学习 python 过程中,相信大家对装饰器的概念很模糊,我也是困惑了很久,决定写一篇文章梳理一下。
首先要搞清楚什么是装饰器:
简单来说,可以把装饰器理解为一个包装函数的函数,在函数运行时增加功能但不影响这个函数原有内容,还可以进行函数执行后的清理工作。
举一个小例子
@func1
def func2():
pass
装饰器做的事情就是 func1(func2) 传递了一个函数对象到我们的装饰器里面然后先执行装饰器 func1 其中的内容,然后再执行函数 func2。
比如举一个普通装饰器的例子
#普通装饰器
def func1(func):
def add_func():
print(‘ 这是我要添加的功能 ’)
return func()
return add_func
@func1
def func2():
print(‘hello world’)
#func1 装饰器函数
#func2 被装饰的函数
>>>func2()
这是我要添加的功能
hello world
在这段代码中 func2()相当于 func1(func2)()->add_func(),再想要执行 func2()函数时,先执行装饰器 func1()函数,并且参数 func 相当于 func2()。执行 func1 函数时由于返回值是 add_func,我们执行的是 func1(func2)(),也就相当于执行 add_func(),输出 ’ 这是我添加的功能 ’,返回一个 func()函数,也就是参数 func 的调用,即对应的 func2 函数的调用。
装饰器的基本框架
def func1(func):
def func2():
return func()
return func1()
进阶
来一个带参数的装饰器吧
def func1(func):
def func2(a,b):
a=1
b=2
return func(a,b)
return func()
@func1
def func(x,y)
print(‘this is a add func’)
print(x+y)
>>>func(10,20)
this is a add func
3
自这段代码中被装饰函数的参数传递到装饰函数的变量中,也就是 x 传递给了 a,y 传递给了 b,return func(a,b)即调用了 func 函数并且函数的参数为 a 和 b。
再高级一点的 装饰器函数带参数(哈哈,是不是感觉有点懵了)
def arg_func(arg):
def _func(func):
def _func1():
if arg==’good’:
print(‘ 出去玩 ’)
if arg==’bad’:
print(‘ 不出去玩 ’)
return func()
return _func1
return _func
@arg_func(‘bad’)
def func():
print(‘bad day’)
@arg_func(‘good’)
def func1()
print(‘good day’)
>>>func()
不出去玩
bad day
>>>func1()
出去玩
good day
这段代码其实很简单,就是装饰器多了一个参数用来判断,看上去也很好理解。同样,执行 func 装饰器接收函数 (arg_func) 的参数是 bad,执行 func1 函数,装饰器接收函数的参数是 good
好了,到这里,装饰器的内容基本上就梳理完了,肯定还有不全的地方或者不好的地方,希望小伙伴们可以多多完善,有需要补充的或者需要改正的在下面留言告诉我哦 (•̀ ω •́)y!文章地址: