装饰器

定义:一个用来“包装”另一个函数,在不修改原函数代码的情况下,给它增加新功能的函数。

先写一个普通函数:

1
2
def login():
print("用户登录")

再写一个包装函数:

1
2
3
4
5
6
7
8
def wrapper(func):
def inner():
print("开始执行")

func()

print(“执行结束”)
return inner

调用:

1
login = wrapper(login)

输出:

1
2
3
4
5
开始执行

用户登录

执行结束

真正的装饰器语法:

python为了方便,不用写:

1
login = wrapper(login)

可以写:

1
2
3
@wrapper
def login():
print("用户登录")

python解释器看到:

1
@wrapper

自动帮你变成:

1
2
3
4
def login():
print("用户登录")

login = wrapper(login)

本质:@只是语法糖,函数 = 装饰器(函数)

装饰器本质:是一个函数,它接收一个函数作为参数,返回一个新的函数,在不修改原函数代码的情况下,为原函数动态添加功能。

特点:

1、接收一个函数作为参数

2、返回一个新的函数(通常是闭包)

3、增强原函数,而不是修改原函数

闭包:

即使外部函数已经执行结束,内部函数仍然可以访问外部函数中的变量。

1
2
3
4
5
def outer():
x = 100
def inner():
print(x)
return inner

调用:

1
f = outer()

输出:

1
100

满足两个条件:

1、里面还有函数

1
2
3
4
def outer():
def inner()
pass

2、内部函数引用了外部变量

1
2
3
4
5
def outer():
x = 100
def inner()
print(x)

只有同时满足才叫闭包