1 封裝概述
成都創新互聯是一家集網站建設,梓潼企業網站建設,梓潼品牌網站建設,網站定制,梓潼網站建設報價,網絡營銷,網絡優化,梓潼網站推廣為一體的創新建站企業,幫助傳統企業提升企業形象加強企業競爭力。可充分滿足這一群體相比中小企業更為豐富、高端、多元的互聯網需求。同時我們時刻保持專業、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們為更多的企業打造出實用型網站。
封裝(Encapsulation),指的是在設計類時, 將不需要對外提供的內容都隱藏起來,提供公共方法以供外部對其訪問。
具體指的是刻意地將一些屬性和方法隱藏(私有化)在類的內部,這樣在使用此類時,將無法直接以類對象.屬性名、或 類對象.方法名(參數) 的形式調用這些私有屬性或私有方法,而只能用未隱藏的公有方法間接操作這些隱藏的私有屬性和私有方法。
封裝的優點,如下所示:
封裝保證了類內部數據結構的完整性:封裝之后,用戶無法直接看到類中的數據結構,只能使用類允許公開的數據(通常指公有方法),很好地避免了外部對內部數據的影響,提高了程序的可維護性。
封裝數據可以很好的保護隱私。
封裝方法的主要原因是隔離復雜度。
封裝提高了代碼的復用性。
還可以輕松實現避免用戶對類中屬性和方法的不合理操作:用戶只能借助暴露出來的類方法來訪問數據,我們只需要在這些暴露的方法中加入適當的控制邏輯,即可輕松實現用戶對類中屬性或方法的不合理操作。
2 Python 類的簡單封裝
為了實現 Python 類的封裝,Python 采取了下面的方法:
公有(共有):默認情況下,類中的變量和方法都是公有的,它們的名稱前都沒有下劃線,公有的變量和方法,在類的外部、類內部以及子類中,都可以正常訪問。
私有:類中的變量或方法以雙下劃線 __ 開頭命名,則該變量或方法為私有的,私有的變量或方法,只能在本類內部使用,類的外部以及子類都無法使用。
也有把變量名或方法名以單下劃線 _ 開頭定義的,通常也表示私有的。
可以定義一個類,類里定義很多函數(主要用它做什么)或直接定義函數在一個py文件中
在另一個文件中導入這個那個py包,調用類和方法
就是封裝了
年前走查腳本代碼時,發現大家對selenium功能都在重復造輪子,而且容易出現一些常見低級bug。于是在閑暇之余,封裝一些常用的selenium功能。
在某些網頁中,存在多個frame嵌套。而selenium提供的find_element函數只能在當前frame中查找,不能切換到其他frame中,需要從最上級frame中逐步切換(當然也可以指定xpath的絕對路徑,但是一般沒人這么做)。在我們寫代碼過程中,需要明確知道當前frame位置和需要尋找元素的frame位置。在frame切換過程中,容易因為疏忽導致frame切換錯誤導致元素無法找到的bug。
頁面中分布的frame,可以理解為樹狀結構。因此我們可以采用遞歸的方式, 沿著某條搜索路線frame節點,依次對樹中每個節點均做一次訪問。
我們以163網址上的登錄框為例:點擊登錄按鈕,彈出登錄iframe頁面。輸入框位置在iframe中,因此我們不能使用xpath獲取元素位置,需要進入iframe中,然后獲取元素。
手動切換ifame可能會產生bug,因此需要一套自動切換和檢索frame的機制。具體代碼如下:
需要注意的是:如果頁面中多個frame中,存在相同的xpath元素。還是需要指定frame的路徑,否則會返回搜索到的第一個元素。
強制等待
直接調用系統time.sleep函數,不管頁面加載情況一定會等待指定的時間, 即使元素已被加載 。
1.如果設置的時間較長,會浪費時間
2.如果設置的時間較短,元素可能沒有加載。
頁面中某元素如果未能立即加載,隱式等待告訴WebDriver需等待一定的時間,然后去查找元素。默認不等待,隱式等待作用于整個WebDriver周期,只需設置一次即可。
1.在上文的find_element函數中,采用遞歸方式在所有frame尋找元素。若采用隱式等待,則在每個frame中都需要等待設定的時間,耗時非常長。
2.某些頁面我們想要的元素已經加載完畢,但是部分其他資源未加載。隱式等待必須等待所有元素加載完畢,增加額外等待時間。
顯示等待一般作用于某一個元素,在設定的時間范圍內,默認每間隔0.5秒查找元素。返回被加載的元素,若超過設定的時間范圍未能查找則報錯。顯示等待作為selenium常用的等待機制,我們來看下他的源碼和機制。
driver 注釋中解釋為WebDriver實例,但是代碼中并未有相關檢測,因此可以傳入任何對象
但是__repr__函數中使用到session_id屬性,如果需要顯示屬性或者轉為str對象,最好在driver對象中添加session_id屬性
在until函數中,我們可以看到driver對象傳入method函數。在計時結束前,在不斷循環執行method函數,如果method函數有正常返回值則退出循環,否則報TimeoutException錯誤。
可以采用裝飾器對隱式等待進行封裝,這樣代碼更加精簡
同樣的,采用裝飾器對其他常用的函數進行封裝,例如強制等待、點擊、輸入文本等。
裝飾器雖然很方便,但也會產生一些麻煩。例如在find_element函數遞歸調用過程中,理應只要執行一次裝飾器函數。但因為裝飾器已經裝飾完畢,導致每次遞歸都會執行。例如強制等待的sleep函數,如果遞歸次數越多等待時間越長。
解除裝飾器一般有兩種做法:一是約定參數,當遞歸第二次調用時則不生效。例如
這種方式實現簡單,容易理解。但是增加了參數限制,在fun函數中就不能使用first_sleep參數。
二是采用裝飾器采用wrapped實現,通過訪問wrapped屬性獲得原始函數。例如
但是某一個函數被多個裝飾器裝飾時,需要遞歸解除裝飾器。例如
最后整體代碼如下
這次的封裝其實還存在很多問題
1.find_element函數不僅僅只是提供查找元素功能,還提供一些其他功能,因此叫element_operation更為合適。
2.find_element函數的參數過多,并且很多參數的使用并不在函數本身中,對代碼閱讀很不友好。
3.得小心避免參數重復問題,假設裝飾器sleep和裝飾器wait_time都使用time這個參數,將無法區分具體是哪個函數使用。
4.不利于擴展和維護,當功能過多時find_element的參數過于龐大。
如果只是簡單地封裝和使用,上面這種方式也能達到較好的效果。如果想進一步封裝,建議采用鏈式調用方式,裝飾器輔助封裝。例如
這樣函數的擴展性和可閱讀性有較大的提升
網站標題:python常用函數封裝,python封裝函數的好處
文章地址:http://vcdvsql.cn/article8/heohip.html
成都網站建設公司_創新互聯,為您提供用戶體驗、網站導航、企業網站制作、電子商務、Google、企業建站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯