1. 程式人生 > 其它 >Python 無固定引數裝飾器

Python 無固定引數裝飾器

技術標籤:Python

裝飾器是什麼

Python 裝飾器(fuctional decorators)是用於拓展原來函式功能的一種函式,目的是在不改變原函式名(或類名)的情況下,給函式增加新的功能。
這個函式的特殊之處在於它的返回值也是一個函式,這個函式是內嵌"原"函式的函式。

裝飾器其實就是一個閉包函式,它是有兩層的函式,它具有函式傳參功能。

裝飾器使用場景

當在多個地方出現雷同的程式碼塊,且這些程式碼與核心業務沒有直接關聯的都可以用裝飾器來代替,裝飾器不僅能減少程式碼量,還使得程式碼邏輯更清晰、可讀性更強,你只需專注於業務邏輯處理就行了。

裝飾器呼叫順序

裝飾器是可以疊加使用的,那麼使用裝飾器以後程式碼是啥順序呢?

對於Python 中的“@”語法糖,裝飾器的呼叫順序與使用“@”語法糖宣告的順序相反。

普通裝飾器在Python 中運用

首先,我們來回顧一下普通的裝飾器,這是一個用於計算函式執行的耗時裝飾器。

import time
def waste_time(func): 
    def function(*args,**kwargs):
        start_time=time.time()
        result=func(*args,**kwargs)
        end_time=time.time()
        spend=end_time-start_time
        print("函式%s 總共耗時%.3f秒:"%(func.__name__,spend))
        return result
    return function

帶引數的裝飾器只需要在原來那個不帶引數的裝飾器基礎上之上在最外層套一個函式,該函式中定義一個引數,然後巢狀函式中引用該引數即可實現。

無固定引數裝飾器在Python 中運用

再來,看看帶引數的裝飾器,這個裝飾器可以通過傳入引數的不同進行不同邏輯的處理:

def decorator_have_args(arg):
    def function_out(function):
        def function_in(*args,**kwargs):
            print("the log is:%s"%arg)
            print("call %s()"%function.__name__)
            print("args={}".format(*args))
            # print("kwargs={}".format(**kwargs))
            if(arg=="flag1"):
                function(*args,**kwargs)
            elif(arg=="flag2"):
                for i in range(3):
                    function(*args,**kwargs)
            else:
                print("pass")
        return function_in
    return function_out

@decorator_have_args("flag1")
def testa(a):
    print("this is testa funcion,a=%s"%a)

@decorator_have_args("flag2")
def testb(b):
    print("this is testb funcion,b=%s"%b)

@decorator_have_args("flagx")
def testc(c):
    print("this is testb funcion,b=%s"%c)

if __name__ == '__main__':
    testa("good")
    testb("better")
    testc("best")

總結

今天的分享是:Python 中如何使用無固定引數的裝飾器,讓程式碼結構和邏輯更加清晰,以及Python 的具體實現。小夥伴們可以參考以上程式碼片段,將程式碼執行起來將更有助於理解裝飾器的執行原理。

歡迎關注【無量測試之道】公眾號,回覆【領取資源】,
Python程式設計學習資源乾貨、
Python+Appium框架APP的UI自動化、
Python+Selenium框架Web的UI自動化、
Python+Unittest框架API自動化、

資源和程式碼 免費送啦~
文章下方有公眾號二維碼,可直接微信掃一掃關注即可。

備註:我的個人公眾號已正式開通,致力於測試技術的分享,包含:大資料測試、功能測試,測試開發,API介面自動化、測試運維、UI自動化測試等,微信搜尋公眾號:“無量測試之道”,或掃描下方二維碼:

新增關注,讓我們一起共同成長!