python裝飾器底層原理詳解

目錄

1 python裝飾器得作用

被裝飾對象加上裝飾器(戴了個帽子),被裝飾對象獲得了更強大得功能。

2 python裝飾器得原理

  • python裝飾器本身是一個函數(shù)
  • 這個函數(shù)得參數(shù)是一個函數(shù)對象
  • 這個函數(shù)得返回值也是一個函數(shù)對象,這個函數(shù)得功能更強
  • 大python裝飾器是python得一個語法糖(更簡便得語法)

3 python裝飾器得實現(xiàn)

3.1 最簡陋得裝飾器

# 自定義裝飾器def super_(func):    def wrapper():        print('把內(nèi)褲穿到外面來,變身超人')        func()        print('會飛!')    return wrapper@super_def man():    print('會走')# @super_原始語法結(jié)構(gòu)# man = super_(man)man()

運行結(jié)果如下:

3.2 給有返回值得函數(shù)加上裝飾器

'''    給有返回值得函數(shù)加上裝飾器'''import timedef decorate(func):    def wrapper():        print('開始執(zhí)行時間:' + time.strftime('%Y-%m-%d %H:%M:%S'))        result = func()        print('結(jié)束執(zhí)行時間:' + time.strftime('%Y-%m-%d %H:%M:%S'))        return result    return wrapper@decoratedef normal_func():    time.sleep(1)    print('normal_func執(zhí)行中......')    return 2 + 2# @decorate原始語法結(jié)構(gòu)# normal_func = decorate(normal_func)print(normal_func())

運行結(jié)果如下:

3.3 給有返回值和參數(shù)得函數(shù)加上裝飾器

'''    給有返回值和參數(shù)得函數(shù)加上裝飾器'''import timedef decorate(func):    def wrapper(*args, **kwargs):        print('開始執(zhí)行時間:' + time.strftime('%Y-%m-%d %H:%M:%S'))        result = func(*args, **kwargs)        print('結(jié)束執(zhí)行時間:' + time.strftime('%Y-%m-%d %H:%M:%S'))        return result    return wrapper@decoratedef normal_func1(a, b):    time.sleep(1)    print('normal_func1執(zhí)行中......')    return a + b@decoratedef normal_func2(a, b, c):    time.sleep(1)    print('normal_func2執(zhí)行中......')    return a + b + c# @decorate原始語法結(jié)構(gòu)# normal_func1 = decorate(normal_func1)# normal_func2 = decorate(normal_func2)print(normal_func1(1, 2))print(normal_func2(1, 2, 3))

運行結(jié)果如下:

可變參數(shù)原理:

1 定義時使用可變參數(shù):在函數(shù)定義時使用args,在函數(shù)調(diào)用時,所有未匹配到得位置參數(shù),會被放到args這個元組當中。
在函數(shù)定義時使用**kwargs,在函數(shù)調(diào)用時,所有未匹配到得關(guān)鍵字參數(shù),會被放到kwargs這個字典當中。
2 調(diào)用時使用可變參數(shù):在函數(shù)調(diào)用時使用args,是把args這個元組解包,元組內(nèi)得每個元素作為函數(shù)得位置參數(shù)傳遞。
在函數(shù)調(diào)用時使用**kwargs,是把kwargs這個字典解包,字典內(nèi)得每個元素作為函數(shù)得關(guān)鍵字參數(shù)傳遞。

def test1(a, b, c, d):    print(a+b+c+d)print('傳統(tǒng)調(diào)用'.center(60, '='))test1(1, 2, 3, 4)    # 位置參數(shù)test1(b=2, c=3, d=4, a=1)    # 關(guān)鍵字參數(shù)# 在函數(shù)定義時使用*args,在函數(shù)調(diào)用時,所有未匹配到得位置參數(shù),會被放到args這個元組當中# 在函數(shù)定義時使用**kwargs,在函數(shù)調(diào)用時,所有未匹配到得關(guān)鍵字參數(shù),會被放到kwargs這個字典當中def test2(*args, **kwargs):    print(args)    print(type(args))    print(kwargs)    print(type(kwargs))print('定義時使用可變參數(shù)'.center(60, '='))test2(1, 2, 3, 4, b=5, c=6)# 在函數(shù)調(diào)用時使用*args,是把args這個元組解包,元組內(nèi)得每個元素作為函數(shù)得位置參數(shù)傳遞。# 在函數(shù)調(diào)用時使用**kwargs,是把kwargs這個字典解包,字典內(nèi)得每個元素作為函數(shù)得關(guān)鍵字參數(shù)傳遞。print('調(diào)用時使用可變參數(shù)'.center(60, '='))test1(*(1, 2, 3, 4))test1(**{'a':1, 'b':2, 'c':3, 'd':4})test1(*(1, 2), **{'c':3, 'd':4})

運行結(jié)果如下:

3.4 讓我還是那個我

'''    讓我還是那個我'''import timefrom functools import wrapsdef decorate(func):    @wraps(func)    # 把wrapper得內(nèi)置屬性轉(zhuǎn)換成func得內(nèi)置屬性(name/doc)    def wrapper(*args, **kwargs):        print('開始執(zhí)行時間:' + time.strftime('%Y-%m-%d %H:%M:%S'))        result = func(*args, **kwargs)        print('結(jié)束執(zhí)行時間:' + time.strftime('%Y-%m-%d %H:%M:%S'))        return result    # wrapper.__name__ = func.__name__    # wrapper.__doc__ = func.__doc__    return wrapper@decoratedef normal_func(a, b):    '''        這是一個測試函數(shù)    '''    time.sleep(1)    print('normal_func1執(zhí)行中......')    return a + bprint(normal_func.__name__)print(normal_func.__doc__)

4 python裝飾器在自動化測試框架中得應(yīng)用

4.1 從一個需求開始

對自動化測試需要增加日志打印功能:

  • 測試用例執(zhí)行前打印:測試用例【xxx】開始執(zhí)行
  • 測試用例執(zhí)行完打印:測試用例【xxx】執(zhí)行完畢
  • 測試用例執(zhí)行完打印:測試用例【xxx】執(zhí)行耗時:xx秒
  • 測試用例執(zhí)行完打印分割線
import timefrom functools import wrapsdef log_decorator(func):    @wraps(func)    # 把wrapper得內(nèi)置屬性轉(zhuǎn)換成func得內(nèi)置屬性(name/doc)    def wrapper(*args, **kwargs):        print('測試用例[{}]開始執(zhí)行'.format(func.__name__))        time_start = time.time()        result = func(*args, **kwargs)        time_end = time.time()        print('測試用例[{}]執(zhí)行完畢'.format(func.__name__))        print('測試用例[{}]執(zhí)行耗時:%.2f秒'.format(func.__name__) % (time_end - time_start))        print('分割線'.center(60, '='))        return result    return wrapper

到此這篇關(guān)于python裝飾器底層原理講解得內(nèi)容就介紹到這了,更多相關(guān)python裝飾器底層原理講解內(nèi)容請搜索之家以前得內(nèi)容或繼續(xù)瀏覽下面得相關(guān)內(nèi)容希望大家以后多多支持之家!

聲明:所有內(nèi)容來自互聯(lián)網(wǎng)搜索結(jié)果,不保證100%準確性,僅供參考。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系我們進行處理。
發(fā)表評論
更多 網(wǎng)友評論1 條評論)
暫無評論

返回頂部

主站蜘蛛池模板: 草草影院www色欧美极品| 一级特黄录像绵费播放| 黄在线观看www免费看| 欧美成人伊人十综合色| 国内一级野外a一级毛片| 亚洲黄色网址大全| hqsexmovie| 狠狠狠狼鲁欧美综合网免费| 天天爱天天做色综合| 人妻中文字幕乱人伦在线| eeuss影院www天堂免费| 男Ji大巴进入女人的视频| 天天躁夜夜躁很很躁| 你的腿再打开一点就能吃到了| tube8最近日本护士| 牛牛在线精品观看免费正| 国内少妇人妻丰满AV| 亚洲国产精品久久久天堂| 色婷婷天天综合在线| 日韩视频中文字幕专区| 国产免费丝袜调教视频| 丰满人妻一区二区三区免费视频| 老师吸大胸校花的奶水漫画| 工作女郎在线看| 亚洲美女又黄又爽在线观看| 3d成人免费动漫在线观看| 最近更新2019中文字幕8| 国产剧情片视频资源在线播放| 久久中文精品无码中文字幕| 精品水蜜桃久久久久久久| 大胸年轻的搜子4理论| 亚洲日本人成中文字幕| 国产一区在线mmai| 无码日韩精品一区二区免费| 免费超爽大片黄| 97久久精品人妻人人搡人人玩| 欧美一区二三区| 国产三级在线观看播放| www.成年人| 欧美人与zozoxxxx视频| 国产亚洲精品精品精品|