1. 函数装饰器
先看一下下面这段代码,它可以帮助我们更好的理解装饰器:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import time
def decorator(func):
def wrapper():
print('time = ', time.time())
func()
return wrapper
def f1():
print('this is a function f1')
f = decorator(f1)
f()
和闭包有很大的相似性, python中一切皆对象,因为f1函数也可以作为对象当作参数传递给函数, 上面这段代码变换一下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import time
def decorator(func):
def wrapper():
print('time = ', time.time())
func()
return wrapper
@decorator
def f1():
print('this is a function f1')
f1()
这个就是一个函数装饰器, 使用@语法糖。它可以达到不需要改变原来函数调用方式,而给函数增加功能的目的。如果f1有参数,怎么办呢,看下面:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import time
def decorator(func):
def wrapper(*args, **kw):
print('time = ', time.time())
print('args = ', args)
func(*args, **kw)
return wrapper
@decorator
def f1(a, b):
print('this is a function f1', a, b)
f1(10, 20)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import time
def decorator(func):
def wrapper(*args):
print('time = ', time.time())
print('args = ', args)
func(*args)
return wrapper
@decorator
def f2(a, b, **kw):
print('this is a function f1', a, b)
print('this is a function f1', kw)
f1(10, 20)
还有一点,一个函数可以同时增加多个装饰器。