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