装饰器
一个简单的装饰器
def wrapper(func):
def inner(*args, **kwargs):
# 执行被装饰函数之前进行的操作
ret = func(*args, **kwargs)
# 执行被装饰函数之后进行的操作
return ret
return inner
@wrapper
def func():
print('func')
func()
装饰器带参数
def outer(flag):
def timer(func):
def inner(*args, **kwargs):
if flag:
print(time.time())
ret = func(*args, **kwargs) # 原来的函数
else:
ret = func(*args, **kwargs) # 原来的函数
return ret
return inner
return timer
@outer(True) # func1 = timer(func1) inner
def func1():
print('func1')
多个装饰器装饰同一个函数
1 def wrapper1(func): 2 def inner(*args, **kwargs): 3 print('wrapper1 前') # 2 4 ret = func(*args, **kwargs) 5 print('wrapper1 后') # 4 6 return ret 7 return inner 8 9 def wrapper2(func): 10 def inner(*args, **kwargs): 11 print('wrapper2 前') # 1 12 ret = func(*args, **kwargs) 13 print('wrapper2 后') # 5 14 return ret 15 return inner 16 17 @wrapper2 # func1 = wrapper2(func1) wrapper2.inner func=wrapper1.inner 18 @wrapper1 # func1 = wrapper1(func1) wrapper1.inner func=func1 19 def func1(): 20 print('func1') # 3 21 return 'func1的返回值' 22 23 print(func1()) # 6
装饰器修复技术
1 from functools import wraps
2 def timer(func):
3 @wraps(func)
4 def inner():
5 print(time.time())
6 ret = func() # 原来的函数
7 return ret
8 return inner