装饰器的本质:一个闭包函数
装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展
装饰器的返回值:也是一个函数
1 import time
2
3 def func1():
4 print('in func1')
5
6 def timer(func):
7 def inner():
8 start = time.time()
9 func()
10 print(time.time() - start)
11 return inner
12
13 func1 = timer(func1)
14 func1()
语法糖
1 import time
2 def timer(func):
3 def inner():
4 start = time.time()
5 func()
6 print(time.time() - start)
7 return inner
8
9 @timer #==> func1 = timer(func1)
10 def func1():
11 print('in func1')
12
13
14 func1()
带参数的装饰器
1 import time
2 def timer(func):
3 def inner(*args,**kwargs):
4 start = time.time()
5 re = func(*args,**kwargs)
6 print(time.time() - start)
7 return re
8 return inner
9
10 @timer #==> func1 = timer(func1)
11 def func1(a,b):
12 print('in func1')
13
14 @timer #==> func2 = timer(func2)
15 def func2(a):
16 print('in func2 and get a:%s'%(a))
17 return 'fun2 over'
18
19 func1('aaaaaa','bbbbbb')
20 print(func2('aaaaaa'))
装饰器的固定格式
1 def timer(func):
2 def inner(*args,**kwargs):
3 '''执行函数之前要做的'''
4 re = func(*args,**kwargs)
5 '''执行函数之后要做的'''
6 return re
7 return inner
1 from functools import wraps
2
3 def deco(func):
4 @wraps(func) #加在最内层函数正上方
5 def wrapper(*args,**kwargs):
6 return func(*args,**kwargs)
7 return wrapper