python之路---裝飾器補充(wraps應用)
阿新 • • 發佈:2019-02-19
裝飾器的作用:
對程式者來說:就是為了在遵循開放-封閉原則的前提下,為被裝飾物件新增新的功能
對於使用者來說:從表面上來看使用方式和以前並沒有改變
import time def timer(func): def wrapper(*args,**kwargs): start_time = time.time() res=func(*args,**kwargs) end_time = time.time() print(end_time - start_time) return res return wrapper @timer def login(): time.sleep(1) ''' 登入驗證功能... :return: 哈哈 ''' print('歡迎光臨!') login()
對上訴裝飾器,實現了為登入函式增加一個執行時間統計功能,對於使用者來說,仍然是呼叫login()來觸發該功能,但是
檢視該函式的屬性時,發生了變化,以__name__,和__doc__為例:
print(login.__name__) print(login.__doc__) #執行結果:---> #wrapper #None
從程式邏輯來看本該是這樣,現在這個變數名login時指向wrapper函式的記憶體地址的,
那麼我們只需要在wapper函式內為其新增與原login函式相同的屬性即可,例如:
import time def timer(func): def wrapper(*args,**kwargs): start_time = time.time() res=func(*args,**kwargs) end_time = time.time() print(end_time - start_time) return res wrapper.__name__ = func.__name__ wrapper.__doc__ = func.__doc__ return wrapper @timer def login(): ''' sadad :return: ''' time.sleep(1) print('歡迎光臨!') login() print(login.__name__) print(login.__doc__)
而wraps可以幫我們完成所有的替換:
import time from functools import wraps def timer(func): @wraps(func) def wrapper(*args,**kwargs): start_time = time.time() res=func(*args,**kwargs) end_time = time.time() print(end_time - start_time) return res return wrapper @timer def login(): ''' sadad :return: ''' time.sleep(1) print('歡迎光臨!') login() print(login.__name__) print(login.__doc__)