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 retreturn 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 retreturn 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 retreturn innerreturn timer
@outer(True) # func1 = timer(func1) inner
def func1():print('func1')
多个装饰器装饰同一个函数def wrapper1(func):def inner(*args, **kwargs):print('wrapper1 前') # 2ret = func(*args, **kwargs)print('wrapper1 后') # 4return retreturn inner
def wrapper2(func):def inner(*args, **kwargs):print('wrapper2 前') # 1ret = func(*args, **kwargs)print('wrapper2 后') # 5return retreturn inner
@wrapper2 # func1 = wrapper2(func1) wrapper2.inner func=wrapper1.inner
@wrapper1 # func1 = wrapper1(func1) wrapper1.inner func=func1
def func1():print('func1') # 3return 'func1的返回值'
print(func1()) # 6
装饰器修复技术from functools import wraps
def timer(func):@wraps(func)def inner():print(time.time())ret = func() # 原来的函数return retreturn inner