最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python裝飾器底層原理詳解

 更新時(shí)間:2022年07月28日 14:06:17   作者:程序媛_  
這篇文章主要介紹了python裝飾器底層原理講解,被裝飾對(duì)象加上裝飾器,被裝飾對(duì)象獲得了更強(qiáng)大的功能,更多相關(guān)內(nèi)容,需要的朋友可以參考一下

1 python裝飾器的作用

被裝飾對(duì)象加上裝飾器(戴了個(gè)帽子),被裝飾對(duì)象獲得了更強(qiáng)大的功能。

2 python裝飾器的原理

  • python裝飾器本身是一個(gè)函數(shù)
  • 這個(gè)函數(shù)的參數(shù)是一個(gè)函數(shù)對(duì)象
  • 這個(gè)函數(shù)的返回值也是一個(gè)函數(shù)對(duì)象,這個(gè)函數(shù)的功能更強(qiáng)
  • 大python裝飾器是python的一個(gè)語法糖(更簡(jiǎn)便的語法)

3 python裝飾器的實(shí)現(xiàn)

3.1 最簡(jiǎn)陋的裝飾器

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

運(yùn)行結(jié)果如下:

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

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

運(yùn)行結(jié)果如下:

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

'''
    給有返回值和參數(shù)的函數(shù)加上裝飾器
'''
import time
def decorate(func):
    def wrapper(*args, **kwargs):
        print('開始執(zhí)行時(shí)間:' + time.strftime('%Y-%m-%d %H:%M:%S'))
        result = func(*args, **kwargs)
        print('結(jié)束執(zhí)行時(shí)間:' + time.strftime('%Y-%m-%d %H:%M:%S'))
        return result
    return wrapper
@decorate
def normal_func1(a, b):
    time.sleep(1)
    print('normal_func1執(zhí)行中......')
    return a + b
@decorate
def 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))

運(yùn)行結(jié)果如下:

可變參數(shù)原理:

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

運(yùn)行結(jié)果如下:

3.4 讓我還是那個(gè)我

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

4 python裝飾器在自動(dòng)化測(cè)試框架中的應(yīng)用

4.1 從一個(gè)需求開始

對(duì)自動(dòng)化測(cè)試腳本需要增加日志打印功能:

  • 測(cè)試用例執(zhí)行前打?。?/strong>測(cè)試用例【xxx】開始執(zhí)行
  • 測(cè)試用例執(zhí)行完打?。?/strong>測(cè)試用例【xxx】執(zhí)行完畢
  • 測(cè)試用例執(zhí)行完打?。?/strong>測(cè)試用例【xxx】執(zhí)行耗時(shí):xx秒
  • 測(cè)試用例執(zhí)行完打印分割線
import time
from functools import wraps

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

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

相關(guān)文章

  • python Windows最新版本安裝教程

    python Windows最新版本安裝教程

    這篇文章主要介紹了python Windows最新版本安裝教程,是python的詳細(xì)安裝教程和環(huán)境變量的配置,需要的小伙伴可以參考一下,希望對(duì)你有所幫助
    2022-02-02
  • Jupyter notebook遠(yuǎn)程訪問服務(wù)器的方法

    Jupyter notebook遠(yuǎn)程訪問服務(wù)器的方法

    今天小編就為大家分享一篇Jupyter notebook遠(yuǎn)程訪問服務(wù)器的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • python飛機(jī)大戰(zhàn) pygame游戲創(chuàng)建快速入門詳解

    python飛機(jī)大戰(zhàn) pygame游戲創(chuàng)建快速入門詳解

    這篇文章主要介紹了python飛機(jī)大戰(zhàn) pygame游戲創(chuàng)建,結(jié)合實(shí)例形式詳細(xì)分析了Python使用pygame創(chuàng)建飛機(jī)大戰(zhàn)游戲的具體步驟與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • python光學(xué)仿真實(shí)現(xiàn)光線追跡之空間關(guān)系

    python光學(xué)仿真實(shí)現(xiàn)光線追跡之空間關(guān)系

    這篇文章主要介紹了python光學(xué)仿真中實(shí)現(xiàn)光線追跡的空間關(guān)系示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-10-10
  • 刪除目錄下相同文件的python代碼(逐級(jí)優(yōu)化)

    刪除目錄下相同文件的python代碼(逐級(jí)優(yōu)化)

    讓我們來分析一下這個(gè)問題:首先,文件個(gè)數(shù)非常多,手工查找是不現(xiàn)實(shí)的,再說,單憑我們?nèi)庋?,在幾千張圖片里面找到完全相同的難度也是很大的
    2012-05-05
  • Python tkinter實(shí)現(xiàn)日期選擇器

    Python tkinter實(shí)現(xiàn)日期選擇器

    這篇文章主要為大家詳細(xì)介紹了Python tkinter實(shí)現(xiàn)日期選擇器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • 基于Python制作短信發(fā)送程序

    基于Python制作短信發(fā)送程序

    這篇文章主要為大家詳細(xì)介紹了如何利用Python制作短信發(fā)送程序,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2023-01-01
  • 對(duì)Django項(xiàng)目中的ORM映射與模糊查詢的使用詳解

    對(duì)Django項(xiàng)目中的ORM映射與模糊查詢的使用詳解

    今天小編就為大家分享一篇對(duì)Django項(xiàng)目中的ORM映射與模糊查詢的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python opencv 讀取本地視頻文件 修改ffmpeg的方法

    python opencv 讀取本地視頻文件 修改ffmpeg的方法

    今天小編就為大家分享一篇python opencv 讀取本地視頻文件 修改ffmpeg的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python格式化輸出詳情

    Python格式化輸出詳情

    這篇文章介紹了Python格式化輸出,主要講解Python格式化輸出的三種方式:%格式化、format格式化、f-String格式化,需要的朋友可以參考下面文章的具體內(nèi)容
    2021-09-09

最新評(píng)論

莫力| 神木县| 白水县| 崇仁县| 东丰县| 临漳县| 博兴县| 濉溪县| 宣武区| 宜丰县| 西宁市| 剑河县| 上高县| 镇远县| 天津市| 通道| 方山县| 兰考县| 隆德县| 崇礼县| 霍林郭勒市| 大冶市| 库车县| 清河县| 朝阳区| 宝兴县| 宿州市| 轮台县| 湖口县| 大城县| 通城县| 东宁县| 鄢陵县| 新蔡县| 城步| 古交市| 苏州市| 黄梅县| 攀枝花市| 天津市| 庐江县|