您好,登錄后才能下訂單哦!
本篇內容介紹了“python裝飾器底層原理是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
被裝飾對象加上裝飾器(戴了個帽子),被裝飾對象獲得了更強大的功能。
python裝飾器本身是一個函數
這個函數的參數是一個函數對象
這個函數的返回值也是一個函數對象,這個函數的功能更強
大python裝飾器是python的一個語法糖(更簡便的語法)
# 自定義裝飾器 def super_(func): def wrapper(): print('把內褲穿到外面來,變身超人') func() print('會飛!') return wrapper @super_ def man(): print('會走') # @super_原始語法結構 # man = super_(man) man()
運行結果如下:
''' 給有返回值的函數加上裝飾器 ''' import time def decorate(func): def wrapper(): print('開始執行時間:' + time.strftime('%Y-%m-%d %H:%M:%S')) result = func() print('結束執行時間:' + time.strftime('%Y-%m-%d %H:%M:%S')) return result return wrapper @decorate def normal_func(): time.sleep(1) print('normal_func執行中......') return 2 + 2 # @decorate原始語法結構 # normal_func = decorate(normal_func) print(normal_func())
運行結果如下:
''' 給有返回值和參數的函數加上裝飾器 ''' import time def decorate(func): def wrapper(*args, **kwargs): print('開始執行時間:' + time.strftime('%Y-%m-%d %H:%M:%S')) result = func(*args, **kwargs) print('結束執行時間:' + time.strftime('%Y-%m-%d %H:%M:%S')) return result return wrapper @decorate def normal_func1(a, b): time.sleep(1) print('normal_func1執行中......') return a + b @decorate def normal_func2(a, b, c): time.sleep(1) print('normal_func2執行中......') return a + b + c # @decorate原始語法結構 # normal_func1 = decorate(normal_func1) # normal_func2 = decorate(normal_func2) print(normal_func1(1, 2)) print(normal_func2(1, 2, 3))
運行結果如下:
可變參數原理:
1 定義時使用可變參數:在函數定義時使用args,在函數調用時,所有未匹配到的位置參數,會被放到args這個元組當中。
在函數定義時使用**kwargs,在函數調用時,所有未匹配到的關鍵字參數,會被放到kwargs這個字典當中。
2 調用時使用可變參數:在函數調用時使用args,是把args這個元組解包,元組內的每個元素作為函數的位置參數傳遞。
在函數調用時使用**kwargs,是把kwargs這個字典解包,字典內的每個元素作為函數的關鍵字參數傳遞。
def test1(a, b, c, d): print(a+b+c+d) print('傳統調用'.center(60, '=')) test1(1, 2, 3, 4) # 位置參數 test1(b=2, c=3, d=4, a=1) # 關鍵字參數 # 在函數定義時使用*args,在函數調用時,所有未匹配到的位置參數,會被放到args這個元組當中 # 在函數定義時使用**kwargs,在函數調用時,所有未匹配到的關鍵字參數,會被放到kwargs這個字典當中 def test2(*args, **kwargs): print(args) print(type(args)) print(kwargs) print(type(kwargs)) print('定義時使用可變參數'.center(60, '=')) test2(1, 2, 3, 4, b=5, c=6) # 在函數調用時使用*args,是把args這個元組解包,元組內的每個元素作為函數的位置參數傳遞。 # 在函數調用時使用**kwargs,是把kwargs這個字典解包,字典內的每個元素作為函數的關鍵字參數傳遞。 print('調用時使用可變參數'.center(60, '=')) test1(*(1, 2, 3, 4)) test1(**{'a':1, 'b':2, 'c':3, 'd':4}) test1(*(1, 2), **{'c':3, 'd':4})
運行結果如下:
''' 讓我還是那個我 ''' import time from functools import wraps def decorate(func): @wraps(func) # 把wrapper的內置屬性轉換成func的內置屬性(name/doc) def wrapper(*args, **kwargs): print('開始執行時間:' + time.strftime('%Y-%m-%d %H:%M:%S')) result = func(*args, **kwargs) print('結束執行時間:' + time.strftime('%Y-%m-%d %H:%M:%S')) return result # wrapper.__name__ = func.__name__ # wrapper.__doc__ = func.__doc__ return wrapper @decorate def normal_func(a, b): ''' 這是一個測試函數 ''' time.sleep(1) print('normal_func1執行中......') return a + b print(normal_func.__name__) print(normal_func.__doc__)
對自動化測試腳本需要增加日志打印功能:
測試用例執行前打印:測試用例【xxx】開始執行
測試用例執行完打印:測試用例【xxx】執行完畢
測試用例執行完打印:測試用例【xxx】執行耗時:xx秒
測試用例執行完打印分割線
import time from functools import wraps def log_decorator(func): @wraps(func) # 把wrapper的內置屬性轉換成func的內置屬性(name/doc) def wrapper(*args, **kwargs): print('測試用例[{}]開始執行'.format(func.__name__)) time_start = time.time() result = func(*args, **kwargs) time_end = time.time() print('測試用例[{}]執行完畢'.format(func.__name__)) print('測試用例[{}]執行耗時:%.2f秒'.format(func.__name__) % (time_end - time_start)) print('分割線'.center(60, '=')) return result return wrapper
“python裝飾器底層原理是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。