Python 装饰器
顾名思义,装饰器其实就是给一个函数加一些修饰功能,为什么不直接改函数源码呢?因为对于某些复杂的函数你没有耐性去阅读了,所以python提供了装饰器这个功能
## 闭包
闭包是指定义在一个函数内的函数,且调用了外部变量或对象,但不能是全局变量。
def outer():
a = 1
def inner():
b = 2
return a + b
return inner
func = outer()
func()
装饰器本身也是一个函数,返回一个函数对象指针。
def decorator(func):
def wrapper(*args, **kwargs):
start = time.time()
func()
end = time.time()
print(end - start)
return wrapper
@decorator
def func():
time.sleep(1)
func()
@语句实质上等于func = decorator(func)
## 装饰链
def makediv(func):
return lambda: '<div>' + func() + '</div>'
def makep(func):
return lambda: '<p>' + func() + '</p>'
@makediv
@makep
def func():
return "Hello world."
func() # 输出"<div><p>Hello world.</p></div>"
可见程序是从上往下依次执行的,func函数先被内层装饰器修饰