原文地址
在学习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!文章地址:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。