装饰器是程序开发中经常会⽤到的⼀个功能,⽤好了装饰器,开发效率如⻁
添翼,所以这也是Python⾯试中必问的问题,但对于好多初次接触这个知识
的⼈来讲,这个功能有点绕,⾃学时直接绕过去了,然后⾯试问到了就挂
了,因为装饰器是程序开发的基础知识,这个都不会,别跟⼈家说你会
Python
在学习装饰器之前,请务必掌握闭包
先举一个简单的例子:
# 闭包函数
def w1(func): # func是一个函数的引用
print("执行w1函数")
def inner():
print("执行inner函数")
func() # 执行func函数
return inner # 将inner作为引用函数返回
def f2():
print("执行f2函数")
fun = w1(f2) # 将f2的引用当做参数传入w1函数中,并用fun接收返回值,此时fun是引用函数
fun() # 执行fun函数
输出结果:
执行w1函数
执行inner函数
执行f2函数
还可以这么写:
def w1(func): # func是一个函数的引用
print("执行w1函数")
def inner():
print("执行inner函数")
func() # 执行func函数
return inner # 将inner作为引用函数返回
@w1
def f1():
print("执行f1函数")
f1() # 调用函数
输出结果:
执行w1函数
执行inner函数
执行f1函数
@w1这种写法是python中的一种语法糖
可以理解为将f1函数作为参数传入w1函数中
被装饰的函数带有参数时
# 闭包函数
def w1(func): # func是一个函数的引用
print("执行w1函数")
def inner(a,b):
print("执行inner函数")
func(a,b) # 执行func函数
return inner # 将inner作为引用函数返回
@w1
def f1(a,b):
print("a+b=",a+b)
f1(1,1) # 调用函数
输出结果:
执行w1函数
执行inner函数
a+b= 2
区别在于如果被修饰函数带有参数,那么inner函数也要带有相应的参数
上述代码也可以理解成:
fun = w1(f1) # 将f1的引用当做参数传入w1函数中,并用fun接收返回值,此时fun是引用函数
fun(a,b) # 执行fun函数