如何將 Python 的乙個類方法變為多個方法?

2021-10-02 08:24:48 字數 1631 閱讀 1064

在 python 中,實現引數化測試的幾個庫,是如何做到把乙個方法變成多個方法,並且將每個方法與相應的引數繫結起來的呢?

我們再提煉一下:在乙個類中,如何使用裝飾器把乙個類方法變成多個類方法(或者產生類似的效果)?

先回顧一下上篇文章中 ddt 庫的寫法:

elif 分支有解析檔案的邏輯,之後跟處理資料相似,所以我們把它略過,主要看前面的 if 分支。這部分的邏輯很清晰,主要完成的任務如下:

遍歷類方法的引數鍵值對

根據原方法及引數對,建立新的方法名

獲取原方法的文件字串

對元組和列表型別的引數作解包

在測試類上新增新的測試方法,並繫結引數與文件字串

這種將裝飾器分散(分別加在類與類方法上),再組合使用的方案,很不優雅。為什麼就不能統一起來使用呢?後面我們會分析它的難言之隱,先按下不表,看看其它的實現方案是怎樣的?

parameterized 如何實現引數化?

先回顧一下上篇文章中 parameterized 庫的寫法:

關於第一點,它跟 ddt 是相似的,只是一些命名風格上的差異,以及引數的解析及繫結不同,不值得太關注。

parameterized 使用的是一種「注入」的方式:

說到區域性命名空間,你可能會想到 locals,但是,我們之前有文章提到過「locals 與 globals 的讀寫問題」,locals 是可讀不可寫的,所以這段**才用了 f_locals。

pytest 如何實現引數化?

按慣例先看看上篇文章中的寫法:

用法也是非常簡單的,然而,其原始碼可複雜多了。我們這裡只關注 parametrize,先看看核心的一段**:

對比一下,前兩個庫的思路很清晰,而且由於其設計單純是為了實現引數化,不像 pytest 有什麼標記和過多的抽象設計,所以更易讀易懂。前兩個庫發揮了 python 的動態特性,設定類屬性或者注入區域性命名空間,而 pytest 倒像是從什麼靜態語言中借鑑的思路,略顯笨拙。

小結

如何將乙個類的屬性轉換成乙個MAP

需求 如何將乙個類轉換成乙個map,同時針對類中的屬性有要求,date型別 需要變成string,yyyy mm dd hh mm ss 物件需要變成json。如何寫乙個通用的工具 下面是具體的實現方式 string value object object override public strin...

python 如何將字串作為乙個物件?

如果閱讀了本系列前兩篇文章中的任何一篇文章,那麼在您的腦海中會立即浮現出這樣一句話 在 python 中,所有事物都是物件。到目前為止,我還沒有涉及到關於 python 中的字串的物件特性的問題,但是,與往常一樣,python 中的字串就是物件。事實上,字串物件是 str 類的乙個例項。正如您在 探...

如何將乙個驅動編譯進核心

將乙個驅動編譯進核心 驅動和核心成為乙個整體,即驅動程式在zimage 或uimage 在核心啟動過程中,會自動安裝驅動。1 將驅動原始碼放在linux核心的原始碼包中 drivers char leds gec210 led.c 在drivers char 下建立了乙個目錄leds,將gec210...