有时候我们可能会有些需要,要求在不改变原函数的情况下给函数增加功能,这个时候装饰器就派上了用场。
要理解装饰器需要先理解什么是闭包。
闭包
定义:在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包。
举一个栗子:
def f_outer(str1):
def f_inner(str2):
print('同桌拿了我的%s,我%s了' %(str1, str2))
return f_inner
#创建闭包
f = f_outer('秘制小汉堡')
f('笑')
输出:
在此我们可以看到闭包的特点
- 函数嵌套
- 内部函数使用了外部函数的变量(还包括外部函数的参数)
- 外部函数返回了内部函数
在此我们还可以看出闭包的作用
保存函数的参数和局部变量(这里没有写,大家可以自己试一下)
装饰器
说到了装饰器,我们需要知道装饰器的本质就是一个闭包
举第二个栗子:
def decorator(func):
print('装饰器启动!')
def inner():
func()
print('爱你傲')
return inner
def wisher():
print('三天之内心想事成')
wisher = decorator(wisher)
#此时wisher已经等于inner了
wisher()
输出:
实际使用的时候我们可以使用语法糖,方便调用
def decorator(func):
print('装饰器启动!')
def inner():
func()
print('爱你傲')
return inner
@decorator
def wisher():
print('三天之内心想事成')
wisher()
接下来我们梳理一下装饰器的执行过程,以便更好的理解和记忆
在执行wisher()时,因为之前语法糖的缘故
实际执行语句
wisher = decorator(wisher)
wisher()
-
这里首先调用了装饰器,并把wisher函数传入,所以先执行了
-
print('装饰器启动!')
-
接下里返回了inner函数,并赋值给wisher,也就是
-
wisher = inner
-
接下来执行wisher(),也就是执行inner()
-
func()
,这里由于之前传参,跳转到 -
def wisher(): print('三天之内心想事成')
执行print('三天之内心想事成')
-
最后执行
print('爱你傲')