python mysql redis mongodb selneium requests二次封裝為什麼大都是使用類的原因,一點見解...

weixin_33958585發表於2018-08-27

1、python mysql  redis mongodb selneium requests舉得這5個庫裡面的主要被使用者使用的東西全都是物件導向的,包括requests.get函式是裡面每次都是例項化了一個新的Session類例項,只是看起來是呼叫函式,要想精確控制使用,直接使用requests get函式和post函式是不夠用的。所以可以下個結論這5個庫都是物件導向的。

2、通常情況下,這些庫都是偏底層使用,暴露了很多基礎api方法,大部分情況下會被使用者進行二次封裝來適合自己更好用。

在對這5個包進行二次封裝的時候,看了幾十份網上程式碼,幾乎是也是物件導向來封裝。

3、在去年時候,我只是覺得他們那些封裝類的很流弊,自己也一直全純函式硬懟,看了他們的程式碼後,也希望是照葫蘆畫瓢使用類,但是始終不得要義,因為他們寫的東西雖然看得很難寫,但呼叫起來卻很爽。

 

4、經厲過一段時間的純函式程式設計。也就是不管什麼專案,不管實現任何功能,程式碼裡面始終只有0個類。

有的東西是教程文件上必須要求你繼承一個類或者必須寫個鴨子類,這種肯定不算自己的類了,因為這只是按照教程照葫蘆畫瓢,教程說要那麼寫就那麼寫,這種類就肯定不算自己的了,比如unittest要用它就必須寫個類繼承TestCase類,網上所有unittest測試都是教我們這麼寫的,那麼程式碼裡面這種類肯定必須排除在外。除開這些文件上規定死了的,程式碼裡面就是隻有0個類了。

 

5、以這五個庫為例,為什麼包括二次封裝時候還要用類呢,經過長期的oop和麵向過程程式設計的經驗總結一下幾點原因:

 

1)、二次封裝這5個包始終有一個客觀東西存在,任何封裝的方法/函式一定是在圍繞這個客觀東西在打轉,例如在mysql裡面是conection、 cursor,selneium裡面是driver,requests裡面是session,redis裡面是redisclient,不管你要封裝什麼自己的公有操作方法,那一定100%繞不開這個客觀的東西,必須使用到它了,當然也可以從一個函式裡面返回connection 、driver,然後把這個東西傳給每一個函式,這樣就造成每個函式的第一個引數永遠是這個東西,看起來很垃圾,在pycharm自動補全上也沒有任何優勢,用模組來充當名稱空間進行補全比用型別來充當名稱空間進行函式或方法補全,體驗上差了一些。使用純函式封裝得到的是一隻殘狗,這狗不能跑,沒有嘴巴,想跑必須把它傳給一個跑的函式,跑(狗,‘北京’),讓狗跑到北京;吃(狗,‘骨頭’)讓狗吃骨頭,狗有多少種技能,就要把這個殘狗傳多少次給函式,始終要傳遞它,構建一個真正的狗,他會有嘴巴,他自己就能跑,不需要把這隻狗在各個方法傳來傳去的。使用類的第一個原因是程式碼補全厲害,補全名稱空間更細第二個原因是程式碼簡潔,不用重複傳參,第三個原因是類在自身實力維護狀態數值和屬性,不需要在程式碼塊外面儲存這些東西。

2)、如果不從一個函式返回driver conn這種東西,然後再把這個東西重複傳給所有函式,那可以把它寫成全域性變數就不需要傳遞那麼多次給其他函式了,那這樣就造成還沒開始使用就彈出瀏覽器,還沒開始使用就連線資料庫,並且寫成全域性變數,一定是寫死了,那怎麼給他設定不同的ip和密碼?只能去修改全域性變數了,但作為被呼叫的模組,還要去修改自身的東西,肯定不合理了,要同時操作兩個資料庫怎麼辦,肯定不能寫死。所以使用類的第四個原因是為了方便初始化不同的配置,第五個原因是類可以多重例項,同時操作兩個資料庫,同時requests操作兩個賬號cookie,用類多重例項更方便,模組是個單例的。

 

以上是從mysql  redis mongodb selneium requests這5個python包為什麼老喜歡用類封裝,而不喜歡寫一堆函式封裝,得出的結論。

二次封裝這5個官方包肯定不會使用繼承的,一定是使用組合,具體模式是代理模式。我沒看見有幾個程式碼去繼承官方webdriver類、繼承pymysql的conection類,幾乎沒網友會這麼做,包括寫得好的包裡面:requests裡面肯定是沒有繼承urllib,torndb肯定沒有繼承MySQLdb。

雖然二次封裝這5個包看不到繼承的優勢,但在其他場景下類比純函式相比,確實有個殺手鐗就是繼承。

 

 

不光是基礎公用模組使用類來實現有強大的優勢,包括業務流程類的程式碼使用類都有強大的優勢

具體就是最近重構了一個功能,然來功能平臺分國內國外,完全是兩個獨立模組檔案,寫完一個複製另一個,但因為有些不同,在另一個檔案裡面硬是扣字母來處理不同點修改得來的,這樣就要維護兩份檔案,重構原因是很難看懂裡面的變數,尤其是巨大的json解析這塊,從一個json解析一個鍵後,這個建的值可能得到的是整形 字串列表 字典,然來的命名亂七八糟,然後還對json的內容了一些計算,沒有型別註釋和起一堆亂七八糟的名字真的是很難記住,所以很不好修改。在修改國外時候明明按照國內的修改,但仍然出錯,只能逐行比較,最好還是放棄了,因為我也是靠猜測來修改國內的可能是瞎貓碰死老鼠,實在是看不懂,最後只能重構了。重構前然來國內是281行,國外是312行,然後redis廣播監聽處理檔案大概是150行,然來實現這個平臺用了700行,但用了繼承後,國內國外總共加起來只有216行,因為所有平臺本身就有一個基類,再加上國外還能繼承國內重寫一些屬性和方法就可以了。所以216行比最少的那個281行還少了70行,在加上廣播處理也是使用了繼承,只用了13行代替瞭然來150行。這樣算起來,oop重構後比完全純函式寫法少了70%的行的程式碼。所以說寫類很繁瑣,寫函式簡單粗暴,這種說法不攻自破。

例如,redis廣播監聽處理,重構後,任何平臺不管國內外只需要13行程式碼,重構前每次一個新平臺都要複製之前的150行,然後在裡面扣字眼修改大概幾十處字母,包括根據不同平臺和國內外區分列印不同的日誌字眼和呼叫不同的函式一共十幾處。

重構後因為複用了以前的基類,所以只寫了13行就可以代替150行,而且基本不會出現複製貼上後扣字修改遺漏導致出錯。

 

 

 

 

 

6、如果對oop嗨非常反對,那可以思考下這5個包的二次封裝為什麼大都是類,不能看網上別人用類你就照葫蘆畫瓢用類(因為其實用函式也可以實現二次封裝的),自己構思想下如果純函式封裝會有哪些缺點和優點?

任何都是先問是不是,再問為什麼?關於是不是oop比純函式在二次封裝這5個包時候比例更高,這一點可以多找找網上的公開程式碼和pypi官網中隨便找幾十個資料庫二次封裝的包來證實。

 

不管寫得好壞,使用百度搜尋,貼出一些使用python來二次封裝操作mysql selnium的文章地址

Python一個簡單的資料庫類封裝

LightMysql:為方便操作MySQL而封裝的Python類

python mysql 封裝

python連線mysql資料庫封裝

Python封裝的訪問MySQL資料庫的類及DEMO

 

selenium基礎框架的封裝(Python版)

Python_selenium二次封裝selenium的幾個方法

史上最強大的python selenium webdriver的包裝

selenium + python自動化測試unittest框架學習(五)webdriver的二次封裝 (唯一一個使用函式)

Day17-selenium的二次封裝

webdriver+expected_conditions二次封裝

 

貼出的11個有10個使用了類,有一個使用函式,所以可以看到,二次封裝這些東西時候90%的人也會使用類。這個使用函式封裝的人正是中了我說的不寫類的原因裡面的第二個原因的圈套,既減少重複傳參,該文章由於既不願意把driver寫成全域性變數,也不願意使用類,所以把driver變數作為了幾十個函式的第一個引數,如果再增加幾十個函式,會反覆傳參幾百次。

 

相關文章