摘要:今天我們來說一個(gè)非常實(shí)用的例子,小菜接到組長老王的一個(gè)任務(wù),安排一個(gè)新的活,這個(gè)活是這樣的老王小菜啊,你幫我寫一個(gè)登入腳本,跑十幾條命令到服務(wù)器上,然后存一下日志。這個(gè)時(shí)候,小菜偷偷的瞄了一眼組長老王,常舒一口氣,總于寫完了。
Python學(xué)了好幾年,發(fā)現(xiàn)功力還是那樣,很多同學(xué)經(jīng)常這樣抱怨!都說Python入門容易,精通難,確實(shí)是這樣的,每當(dāng)我們打開一些牛逼的源碼框架,進(jìn)去看窺探大牛的源碼,比如Python里面非常著名的Django和Flask里面的源碼,發(fā)現(xiàn)跟天書一樣。
今天我們來說一個(gè)非常實(shí)用的例子,小菜接到組長老王的一個(gè)任務(wù),安排一個(gè)新的活,這個(gè)活是這樣的:
老王:小菜啊,你幫我寫一個(gè)ssh登入腳本,跑十幾條命令到服務(wù)器上,然后存一下日志。
小王:哇,這活簡單啊,so easy 分分鐘搞定?。∵@不就是一個(gè)登入服務(wù)器的命令嗎~~
小王思考了0.08秒,寫下來猥代碼:
1.開始擼代碼
這個(gè)活很簡單,于是非常簡單的想到了用Python里面的paramiko模塊,直接分分鐘搞定。
小菜分分鐘就寫完了代碼,豁然覺得有點(diǎn)不對,這樣交差是不是有點(diǎn)過分,怎么說自己也學(xué)了2年P(guān)ython ,這代碼完全沒有封裝啊。不行不行,有點(diǎn)太"菜"了,不行,我要裝高手一點(diǎn),于是趕緊寫了第二版。
2.封裝成類
上面的代碼太簡單的了,簡直就是原型機(jī)器,于是小菜用類去封裝了一下,改進(jìn)了一下。
設(shè)計(jì)了一個(gè)SSHClinet類,把一些用戶名/密碼/主機(jī)地址/端口都封裝到類的屬性里面,然后設(shè)計(jì)了connect函數(shù)去進(jìn)行連接,如果出現(xiàn)異常就進(jìn)行處理。然后所有的日志記錄都存到雙向隊(duì)列history里面。
然后我們跑到服務(wù)器上執(zhí)行命令,并把處理的結(jié)果stdout結(jié)果進(jìn)行簡單的處理,存儲到history里面。當(dāng)然把讀取histroy和關(guān)閉鏈接close()也做了封裝。
這個(gè)時(shí)候,小菜偷偷的瞄了一眼組長老王,常舒一口氣,總于寫完了。然后跑一下看看吧。
>
Dump the command history...
{"pwd": "/root"}
{"date": "Mon Sep 20 16:09:19 CST 2021"}
Close ssh connection!
跑的沒有問題啊,代碼也很clean啊,異常都考慮了啊,打完收工!
3.啥事帶上下文管理器的類
老王過來檢查小菜干的活,大概看了1分鐘,一臉嚴(yán)肅的說:
小菜啊,你知道with的用法吧,為啥家我們在讀寫文件的時(shí)候,都喜歡用with語句,因?yàn)榉奖惆?。我們讀寫文件用with,然后關(guān)閉啥的我們都不用關(guān),有with自動幫我處理。比如下面的情況:
with open("菜鳥學(xué)Python.txt","w" ,encoding="utf-8") as wf: wf.write("我要好好學(xué)Python")
那么我們上面寫的SSHClinet類是否也能像with一樣靈活方便的,你好好想想吧。
這其實(shí)就是帶上下文管理器的類,如果構(gòu)建呢?其實(shí)很簡單:
我們只需要再類里面增加2個(gè)魔法函數(shù),一個(gè)是__enter__,一個(gè)是__exit__即可,就可以迅速把普通的類山雞變鳳凰。注意enter里面一定要返回類的對象self,否則無法調(diào)用run方法。
運(yùn)行一下看看:
是不是非常干凈,清爽,我們把主要的邏輯封裝到run里面,然后ssh連接服務(wù)器和關(guān)閉服務(wù)器都封到enter和exit里面即可。這樣代碼也更pythonic。
4.進(jìn)階高手
經(jīng)過上面的講解,相信大家都明白了,于是小菜若有所思的開始動手修改了原來的代碼。把普通的類變成了帶上下文管理器的類。
整個(gè)的代碼80%都跟原來的類似,我們只是增加了__enter和__exit__,其實(shí)就是原來的 connect和close 邏輯部分,但是這樣一修改,外邊在使用我們這個(gè)庫的時(shí)候就會很簡單。
>
Dump the command history...
{"pwd": "/root"}
{"date": "Mon Sep 20 16:42:00 CST 2021"}
Close ssh connection!
是不是爽多了,高手和菜鳥的區(qū)別,在于寫完代碼之后會思考代碼如果優(yōu)化,如果提高它的擴(kuò)展性,如果提高它的穩(wěn)定性,如果這個(gè)代碼復(fù)用,如果這個(gè)代碼有更多人調(diào)用,我應(yīng)該如何讓他使用更簡單。
如果你經(jīng)常寫代碼的時(shí)候問這么多如果,相信總有一天你的coding 功力會大增。歡迎大家在留言區(qū)指導(dǎo)工作,記得給個(gè)三連哈!
推薦閱讀:
入門:?最全的零基礎(chǔ)學(xué)Python的問題? |?零基礎(chǔ)學(xué)了8個(gè)月的Python?|?實(shí)戰(zhàn)項(xiàng)目?|學(xué)Python就是這條捷徑
量化:?定投基金到底能賺多少錢?? |?我用Python對去年800只基金的數(shù)據(jù)分析
干貨:爬取豆瓣短評,電影《后來的我們》?|?38年NBA最佳球員分析|? ?從萬眾期待到口碑撲街!唐探3令人失望? |?笑看新倚天屠龍記燈謎答題王?|用Python做個(gè)海量小姐姐素描圖碟中諜這么火,我用機(jī)器學(xué)習(xí)做個(gè)迷你推薦系統(tǒng)電影
趣味:彈球游戲? |?九宮格? |?漂亮的花?|?兩百行Python《天天酷跑》游戲!
AI:?會做詩的機(jī)器人給圖片上色?|?預(yù)測收入?|?碟中諜這么火,我用機(jī)器學(xué)習(xí)做個(gè)迷你推薦系統(tǒng)電影
小工具:?Pdf轉(zhuǎn)Word,輕松搞定表格和水印!?|?一鍵把html網(wǎng)頁保存為pdf!|??再見PDF提取收費(fèi)!?|?用90行代碼打造最強(qiáng)PDF轉(zhuǎn)換器,word、PPT、excel、markdown、html一鍵轉(zhuǎn)換?|?制作一款釘釘?shù)蛢r(jià)機(jī)票提示器!?|60行代碼做了一個(gè)語音壁紙切換器天天看小姐姐!|
年度爆款文案
點(diǎn)閱讀原文,領(lǐng)AI全套資料!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/121548.html
摘要:譯文鏈接編程派有時(shí)候,利用語言簡潔優(yōu)雅地解決問題的方法,會隨著時(shí)間變化。隨著不斷進(jìn)化,統(tǒng)計(jì)列表元素?cái)?shù)量的方法也在改變。最后將字典中相應(yīng)鍵的值設(shè)置為新的計(jì)數(shù)。我們發(fā)現(xiàn)這種方法比之前的代碼更加簡潔優(yōu)雅,所以提交了此次修改。 showImg(https://segmentfault.com/img/remote/1460000010723715); 文中如對專業(yè)術(shù)語的翻譯有誤,請Pytho...
摘要:但一般情況下,我們使用類作為元類。那么,元類到底有什么用呢要你何用元類的主要目的是為了控制類的創(chuàng)建行為。當(dāng)然,有很多種做法,這里展示用元類的做法。當(dāng)你創(chuàng)建類時(shí),解釋器會調(diào)用元類來生成它,定義一個(gè)繼承自的普通類意味著調(diào)用來創(chuàng)建它。 元類 Python 中的元類(metaclass)是一個(gè)深度魔法,平時(shí)我們可能比較少接觸到元類,本文將通過一些簡單的例子來理解這個(gè)魔法。 類也是對象 在 Py...
摘要:然后煎魚加了一個(gè)后再調(diào)用函數(shù),得到的輸出結(jié)果和加修飾器的一樣,換言之等效于因此,我們對于,可以理解是,它通過閉包的方式把新函數(shù)的引用賦值給了原來函數(shù)的引用。 Python有什么好學(xué)的這句話可不是反問句,而是問句哦。 主要是煎魚覺得太多的人覺得Python的語法較為簡單,寫出來的代碼只要符合邏輯,不需要太多的學(xué)習(xí)即可,即可從一門其他語言跳來用Python寫(當(dāng)然這樣是好事,誰都希望入門簡...
摘要:之所以能卓爾不群靠地就是一種自成一派且精悍有效的編輯器哲學(xué)當(dāng)然也是,就好像網(wǎng)游千千萬卻唯有一覽眾山小,那靠地不是技巧與外在,而是與眾不同的世界觀。征服其實(shí)是一種領(lǐng)悟,我融入了的哲學(xué)而已。這也是好東西,它比上一個(gè)更貼近的哲學(xué)。 就在幾個(gè)小時(shí)以前,我回答了一個(gè)關(guān)于推薦開發(fā)工具的問題,很多朋友表示喜歡和鼓勵,非常感謝!我也很想多寫一些細(xì)節(jié),于是便起意開一個(gè)系列來聊聊我多次提到的 Vim。 ...
摘要:使用抽象基類顯示表示接口如果類的作用是定義接口,應(yīng)該將其明確定義為抽象基類。此外,抽象基類可以作為其他類的唯一基類,混入類則決不能作為唯一的基類,除非這個(gè)混入類繼承了另一個(gè)更具體的混入這種做法非常少見。 《流暢的Python》筆記本篇是面向?qū)ο髴T用方法的第五篇,我們將繼續(xù)討論繼承,重點(diǎn)說明兩個(gè)方面:繼承內(nèi)置類型時(shí)的問題以及多重繼承。概念比較多,較為枯燥。 1. 繼承內(nèi)置類型 內(nèi)置類型...
閱讀 1531·2021-11-17 09:33
閱讀 3118·2021-10-13 09:39
閱讀 2790·2021-10-09 10:01
閱讀 2531·2021-09-29 09:35
閱讀 4049·2021-09-26 10:01
閱讀 3593·2019-08-26 18:37
閱讀 3241·2019-08-26 13:46
閱讀 1972·2019-08-26 13:39