網站首頁 編程語言 正文
1 python裝飾器的作用
被裝飾對象加上裝飾器(戴了個帽子),被裝飾對象獲得了更強大的功能。
2 python裝飾器的原理
- python裝飾器本身是一個函數
- 這個函數的參數是一個函數對象
- 這個函數的返回值也是一個函數對象,這個函數的功能更強
- 大python裝飾器是python的一個語法糖(更簡便的語法)
3 python裝飾器的實現
3.1 最簡陋的裝飾器
# 自定義裝飾器
def super_(func):
def wrapper():
print('把內褲穿到外面來,變身超人')
func()
print('會飛!')
return wrapper
@super_
def man():
print('會走')
# @super_原始語法結構
# man = super_(man)
man()
運行結果如下:
3.2 給有返回值的函數加上裝飾器
'''
給有返回值的函數加上裝飾器
'''
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())
運行結果如下:
3.3 給有返回值和參數的函數加上裝飾器
'''
給有返回值和參數的函數加上裝飾器
'''
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})
運行結果如下:
3.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__)
4 python裝飾器在自動化測試框架中的應用
4.1 從一個需求開始
對自動化測試腳本需要增加日志打印功能:
- 測試用例執行前打印:測試用例【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
原文鏈接:https://blog.csdn.net/weixin_49026134/article/details/124050313
相關推薦
- 2022-04-22 Jmeter之控制線程執行到某個結果時退出執行(第二種解決方案)
- 2022-12-05 一文教你如何優雅處理Golang中的異常_Golang
- 2022-05-26 為Jenkins創建定時構建任務_相關技巧
- 2023-03-17 Docker部署Nginx并修改配置文件的兩種方式_docker
- 2022-05-11 C#實現漢字轉漢語拼音的示例代碼_C#教程
- 2022-04-26 JQuery實現電梯導航特效_jquery
- 2022-06-01 C#類型轉換之自定義隱式轉換和顯式轉換_C#教程
- 2022-11-05 Nginx負載均衡之upstream模塊簡介與使用詳解_nginx
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支