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