一. 裝飾器app
在不改變原函數的調用方式和函數,額外的增長功能函數
1. 簡單裝飾器spa
import time def timer(func): def inner(): print(time.time()) func() return inner() @timer def func1(): print('func1')
2. 函數帶返回值code
import time def timer(func): def inner(): print(time.time()) ret = func() return ret return inner
3. 原函數攜帶參數blog
def download(func): def inner(*args, **kwargs): print('下載軟件') func(*args, **kwargs) return inner
4. 完整的裝飾器的寫法class
def warpper(func): def inner(*args, **kwargs): print('inner') ret = func(*args, **kwargs) return ret return inner @warpper def func1(): print('func1') func1()
5. 裝飾器帶參數import
import time flag = True 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') func1()
6. 多個裝飾器裝飾同一個函數軟件
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
7. 裝飾器修復技術下載
import time from functools import wraps def timer(func): @wraps(func) def inner(): print(time.time()) ret = func() # 原來的函數 return ret return inner @timer # func1 = timer(func1) def func1(): """ func1 xxxx :return: """ print('func1') return 'func1的返回值' @timer # func1 = timer(func1) def func2(): """ func2 xxxx :return: """ print('func2') return 'func2的返回值' print(func1.__name__) print(func2.__name__) print(func2.__doc__)