3

假装Python高手,把类这样改,真刺激!

 2 years ago
source link: https://blog.csdn.net/cainiao_python/article/details/120499984
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

假装Python高手,把类这样改,真刺激!

Python学了好几年,发现功力还是那样,很多同学经常这样抱怨!都说Python入门容易,精通难,确实是这样的,每当我们打开一些牛逼的源码框架,进去看窥探大牛的源码,比如Python里面非常著名的Django和Flask里面的源码,发现跟天书一样

5447eb53287ffc4113393e2b3f027b19.png

今天我们来说一个非常实用的例子,小菜接到组长老王的一个任务,安排一个新的活,这个活是这样的:

老王:小菜啊,你帮我写一个ssh登入脚本,跑十几条命令到服务器上,然后存一下日志。

小王:哇,这活简单啊,so easy 分分钟搞定啊!这不就是一个登入服务器的命令吗~~

小王思考了0.08秒,写下来猥代码:

19e045f7272900f432b3c8cfb1200d7c.png

fd4873d262a637bb62291d647096abc2.png

1.开始撸代码

这个活很简单,于是非常简单的想到了用Python里面的paramiko模块,直接分分钟搞定。

2fd78ee1a8a08128b44c03bfda0d11ef.png

小菜分分钟就写完了代码,豁然觉得有点不对,这样交差是不是有点过分,怎么说自己也学了2年Python ,这代码完全没有封装啊。不行不行,有点太'菜'了,不行,我要装高手一点,于是赶紧写了第二版。

2.封装成类

上面的代码太简单的了,简直就是原型机器,于是小菜用类去封装了一下,改进了一下。

fa492393281004a689c008ec5686a3ab.png

设计了一个SSHClinet类,把一些用户名/密码/主机地址/端口都封装到类的属性里面,然后设计了connect函数去进行连接,如果出现异常就进行处理。然后所有的日志记录都存到双向队列history里面。

db5c29a1b463f6c636cbc734b8e393e8.png

然后我们跑到服务器上执行命令,并把处理的结果stdout结果进行简单的处理,存储到history里面。当然把读取histroy和关闭链接close()也做了封装。

这个时候,小菜偷偷的瞄了一眼组长老王,常舒一口气,总于写完了。然后跑一下看看吧。

3956b5b3abddfe0d86687540cadd12c5.png

Dump the command history...

{'pwd': '/root'}

{'date': 'Mon Sep 20 16:09:19 CST 2021'}

Close ssh connection!

跑的没有问题啊,代码也很clean啊,异常都考虑了啊,打完收工!

3.啥事带上下文管理器的类

老王过来检查小菜干的活,大概看了1分钟,一脸严肃的说:

小菜啊,你知道with的用法吧,为啥家我们在读写文件的时候,都喜欢用with语句,因为方便啊。我们读写文件用with,然后关闭啥的我们都不用关,有with自动帮我处理。比如下面的情况:

那么我们上面写的SSHClinet类是否也能像with一样灵活方便的,你好好想想吧。

这其实就是带上下文管理器的类,如果构建呢?其实很简单:

cce059254609d3f9fb38e33b99c6d010.png

我们只需要再类里面增加2个魔法函数,一个是__enter__,一个是__exit__即可,就可以迅速把普通的类山鸡变凤凰。注意enter里面一定要返回类的对象self,否则无法调用run方法。

运行一下看看:

0678cc22d4e29bdc8a4c48d704d7e608.png

是不是非常干净,清爽,我们把主要的逻辑封装到run里面,然后ssh连接服务器和关闭服务器都封到enter和exit里面即可。这样代码也更pythonic。

4.进阶高手

经过上面的讲解,相信大家都明白了,于是小菜若有所思的开始动手修改了原来的代码。把普通的类变成了带上下文管理器的类。

841d1089cf76bdac6724537b74dcfb6f.png

整个的代码80%都跟原来的类似,我们只是增加了__enter和__exit__,其实就是原来的 connect和close 逻辑部分,但是这样一修改,外边在使用我们这个库的时候就会很简单。

9fcced737bb921ac3f107b6e2c9d3c1e.png

Dump the command history...

{'pwd': '/root'}

{'date': 'Mon Sep 20 16:42:00 CST 2021'}

Close ssh connection!

是不是爽多了,高手和菜鸟的区别,在于写完代码之后会思考代码如果优化,如果提高它的扩展性,如果提高它的稳定性,如果这个代码复用,如果这个代码有更多人调用,我应该如何让他使用更简单

如果你经常写代码的时候问这么多如果,相信总有一天你的coding 功力会大增。欢迎大家在留言区指导工作,记得给个三连哈!

推荐阅读:

入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python | 实战项目 |学Python就是这条捷径

量化: 定投基金到底能赚多少钱?  | 我用Python对去年800只基金的数据分析

干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析|   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记灯谜答题王 |用Python做个海量小姐姐素描图碟中谍这么火,我用机器学习做个迷你推荐系统电影

趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!

AI: 会做诗的机器人给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影

小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!

年度爆款文案

点阅读原文,领AI全套资料!

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK