专业编程基础技术教程

网站首页 > 基础教程 正文

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

ccvgpt 2024-08-29 13:13:59 基础教程 13 ℃

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

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

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

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

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

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


1.开始撸代码

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

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


2.封装成类

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

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

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

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

>

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自动帮我处理。比如下面的情况:

with open('菜鸟学Python.txt','w' ,encoding='utf-8') as wf:
    wf.write('我要好好学Python')

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

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

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

运行一下看看:

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


4.进阶高手

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

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

>

Dump the command history...

{'pwd': '/root'}

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

Close ssh connection!

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

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

最近发表
标签列表