中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python裝飾器底層原理是什么

發布時間:2022-07-28 16:11:40 來源:億速云 閱讀:136 作者:iii 欄目:開發技術

本篇內容介紹了“python裝飾器底層原理是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

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

運行結果如下:

python裝飾器底層原理是什么

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

運行結果如下:

python裝飾器底層原理是什么

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

運行結果如下:

python裝飾器底層原理是什么

可變參數原理:

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

運行結果如下:

python裝飾器底層原理是什么

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

python裝飾器底層原理是什么

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

“python裝飾器底層原理是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武安市| 醴陵市| 惠来县| 大关县| 德钦县| 商丘市| 湘潭市| 定兴县| 延庆县| 郑州市| 环江| 崇义县| 台南县| 秭归县| 台北市| 定安县| 苍南县| 石泉县| 鄱阳县| 靖西县| 平昌县| 白朗县| 金门县| 通化市| 锡林郭勒盟| 天镇县| 河东区| 宾川县| 石阡县| 池州市| 翼城县| 泾源县| 元谋县| 开封县| 图片| 定安县| 雅安市| 永兴县| 汉沽区| 宜城市| 北票市|