1.装饰器
装饰器:在不改变原函数的调用方式和函数,额外的增加功能
简单装饰器
def timer(func):
def inner():
print(time.time())
func() # 原来的函数
return inner
@timer # func1 = timer(func1)
def func1():
print('func1')
函数带返回值
def timer(func):
def inner():
print(time.time())
ret = func() # 原来的函数
return ret
return inner
原函数携带参数
def download(func):
def inner(*args, **kwargs):
print('下载软件')
func(*args, **kwargs)
return inner
完整的装饰器的写法
def wrapper(func):
def inner(*args, **kwargs):
# 执行被装饰函数之前进行的操作
ret = func(*args, **kwargs)
# 执行被装饰函数之后进行的操作
return ret
return inner
装饰器带参数
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')
多个装饰器装饰同一个函数
def wrapper1(func):
def inner(*args, **kwargs):
print('wrapper1 前') # 2
ret = func(*args, **kwargs)
print('wrapper1 后') # 4
return ret
return inner
def wrapper2(func):
def inner(*args, **kwargs):
print('wrapper2 前') # 1
ret = func(*args, **kwargs)
print('wrapper2 后') # 5
return ret
return inner
@wrapper2 # func1 = wrapper2(func1) wrapper2.inner func=wrapper1.inner
@wrapper1 # func1 = wrapper1(func1) wrapper1.inner func=func1
def func1():
print('func1') # 3
return 'func1的返回值'
print(func1()) # 6
![](https://i-blog.csdnimg.cn/blog_migrate/d2335de737cc5f05540826bd2e36d5ae.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b77589ab31e95c8654927dece3ba8b09.png)
装饰器修复技术
from functools import wraps
def timer(func):
@wraps(func)
def inner():
print(time.time())
ret = func() # 原来的函数
return ret
return inner