1. 程式人生 > >python之路---裝飾器補充(wraps應用)

python之路---裝飾器補充(wraps應用)

裝飾器的作用:

 對程式者來說:就是為了在遵循開放-封閉原則的前提下,為被裝飾物件新增新的功能

 對於使用者來說:從表面上來看使用方式和以前並沒有改變

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__)