文章截取自https://www.cnblogs.com/lianyingteng/p/7743876.html
如果内部函数里引用了外部函数里定义的对象(甚至是外层之外,但不是全局变量),那么此时内部函数就被称为闭包函数。
闭包可以将其自己的代码和作用域以及外部函数的作用结合在一起。
什么函数可以被称为闭包函数呢?主要是满足两点:函数内部定义的函数;引用了外部变量但非全局变量。
python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针)。装饰器函数的外部函数传入我要装饰的函数名字,返回经过修饰后函数的名字;内层函数(闭包)负责修饰被修饰函数。从上面这段描述中我们需要记住装饰器的几点属性,以便后面能更好的理解:
实质: 是一个函数
参数:是你要装饰的函数名(并非函数调用)
返回:是装饰完的函数名(也非函数调用)
作用:为已经存在的对象添加额外的功能
特点:不需要对对象做任何的代码上的变动
python装饰器有很多经典的应用场景,比如:插入日志、性能测试、事务处理、权限校验等。装饰器是解决这类问题的绝佳设计。并且从引入中的列子中我们也可以归纳出:装饰器最大的作用就是对于我们已经写好的程序,我们可以抽离出一些雷同的代码组建多个特定功能的装饰器,这样我们就可以针对不同的需求去使用特定的装饰器,这时因为源码去除了大量泛化的内容而使得源码具有更加清晰的逻辑。
import time
def wrapper(f): #1#进入函数后直接执行return inner这句话是把原来的函数func换成inner,因
#为inner中包含func()(@wrapper将func()作为f导入加入到inner()中了)。
def inner(): #3# #6#
t1 = time.time()
f() #7# 这个f()是func()跳转执行
t2 = time.time() #10#
print(t2 - t1) #11#打印晚也就是执行完inner了即执行完最后一行func()
return inner #4#
@wrapper #2#程序先执行这句话,它等价于func=wrapper(func)
def func(): #8#
time.sleep(2) #9#
func() #5#此时这个func()实际上就是inner,执行到这程序会调用inner