1、python mysql  redis mongodb selneium requests举得这5个库里面的主要被用户使用的东西全都是面向对象的,包括requests.get函数是里面每次都是实例化了一个新的Session类实例,只是看起来是调用函数,要想精确控制使用,直接使用requests get函数和post函数是不够用的。所以可以下个结论这5个库都是面向对象的。

2、通常情况下,这些库都是偏底层使用,暴露了很多基础api方法,大部分情况下会被用户进行二次封装来适合自己更好用。

在对这5个包进行二次封装的时候,看了几十份网上代码,也几乎是也是面向对象来封装。

3、在去年时候,我只是觉得他们那些封装类的很流弊,自己也一直全纯函数硬怼,看了他们的代码后,也希望是照葫芦画瓢使用类,但是始终不得要义,因为他们写的东西虽然看得很难写,但调用起来却很爽。

4、经厉过一段时间的纯函数编程。也就是不管什么项目,不管实现任何功能,代码里面始终只有0个类。

有的东西是教程文档上必须要求你继承一个类或者必须写个鸭子类,这种肯定不算自己的类了,因为这只是按照教程照葫芦画瓢,教程说要那么写就那么写,这种类就肯定不算自己的了,比如unittest要用它就必须写个类继承TestCase类,网上所有unittest测试都是教我们这么写的,那么代码里面这种类肯定必须排除在外。除开这些文档上规定死了的,代码里面就是只有0个类了。

5、以这五个库为例,为什么包括二次封装时候还要用类呢,经过长期的oop和面向过程编程的经验总结一下几点原因:

1)、在二次封装这5个包始终有一个客观东西存在,任何封装的方法/函数一定是在围绕这个客观东西在打转,例如在mysql里面是conection、 cursor,selneium里面是driver,requests里面是session,redis里面是redisclient,不管你要封装什么自己的公有操作方法,那一定100%绕不开这个客观的东西,必须使用到它了,当然也可以从一个函数里面返回connection 、driver,然后把这个东西传给每一个函数,这样就造成每个函数的第一个参数永远是这个东西,看起来很垃圾,在pycharm自动补全上也没有任何优势,用模块来充当命名空间进行补全比用类型来充当命名空间进行函数或方法补全,体验上差了一些。使用纯函数封装得到的是一只残狗,这狗不能跑,没有嘴巴,想跑必须把它传给一个跑的函数,跑(狗,‘北京’),让狗跑到北京;吃(狗,‘骨头’)让狗吃骨头,狗有多少种技能,就要把这个残狗传多少次给函数,始终要传递它,构建一个真正的狗,他会有嘴巴,他自己就能跑,不需要把这只狗在各个方法传来传去的。使用类的第一个原因是代码补全厉害,补全命名空间更细,第二个原因是代码简洁,不用重复传参,第三个原因是类在自身实力维护状态数值和属性,不需要在代码块外面保存这些东西。

2)、如果不从一个函数返回driver conn这种东西,然后再把这个东西重复传给所有函数,那可以把它写成全局变量就不需要传递那么多次给其他函数了,那这样就造成还没开始使用就弹出浏览器,还没开始使用就连接数据库,并且写成全局变量,一定是写死了,那怎么给他设置不同的ip和密码?只能去修改全局变量了,但作为被调用的模块,还要去修改自身的东西,肯定不合理了,要同时操作两个数据库怎么办,肯定不能写死。所以使用类的第四个原因是为了方便初始化不同的配置,第五个原因是类可以多重实例,同时操作两个数据库,同时requests操作两个账号cookie,用类多重实例更方便,模块是个单例的。

以上是从mysql  redis mongodb selneium requests这5个python包为什么老喜欢用类封装,而不喜欢写一堆函数封装,得出的结论。

二次封装这5个官方包肯定不会使用继承的,一定是使用组合,具体模式是代理模式。我没看见有几个代码去继承官方webdriver类、继承pymysql的conection类,几乎没网友会这么做,包括写得好的包里面:requests里面肯定是没有继承urllib,torndb肯定没有继承MySQLdb。

虽然二次封装这5个包看不到继承的优势,但在其他场景下类比纯函数相比,确实有个杀手锏就是继承。

不光是基础公用模块使用类来实现有强大的优势,包括业务流程类的代码使用类都有强大的优势。

具体就是最近重构了一个功能,然来功能平台分国内国外,完全是两个独立模块文件,写完一个复制另一个,但因为有些不同,在另一个文件里面硬是扣字母来处理不同点修改得来的,这样就要维护两份文件,重构原因是很难看懂里面的变量,尤其是巨大的json解析这块,从一个json解析一个键后,这个建的值可能得到的是整形 字符串列表 字典,然来的命名乱七八糟,然后还对json的内容了一些计算,没有类型注释和起一堆乱七八糟的名字真的是很难记住,所以很不好修改。在修改国外时候明明按照国内的修改,但仍然出错,只能逐行比较,最好还是放弃了,因为我也是靠猜测来修改国内的可能是瞎猫碰死老鼠,实在是看不懂,最后只能重构了。重构前然来国内是281行,国外是312行,然后redis广播监听处理文件大概是150行,然来实现这个平台用了700行,但用了继承后,国内国外总共加起来只有216行,因为所有平台本身就有一个基类,再加上国外还能继承国内重写一些属性和方法就可以了。所以216行比最少的那个281行还少了70行,在加上广播处理也是使用了继承,只用了13行代替了然来150行。这样算起来,oop重构后比完全纯函数写法少了70%的行的代码。所以说写类很繁琐,写函数简单粗暴,这种说法不攻自破。

例如,redis广播监听处理,重构后,任何平台不管国内外只需要13行代码,重构前每次一个新平台都要复制之前的150行,然后在里面扣字眼修改大概几十处字母,包括根据不同平台和国内外区分打印不同的日志字眼和调用不同的函数一共十几处。

重构后因为复用了以前的基类,所以只写了13行就可以代替150行,而且基本不会出现复制粘贴后扣字修改遗漏导致出错。

6、如果对oop嗨非常反对,那可以思考下这5个包的二次封装为什么大都是类,不能看网上别人用类你就照葫芦画瓢用类(因为其实用函数也可以实现二次封装的),自己构思想下如果纯函数封装会有哪些缺点和优点?

任何都是先问是不是,再问为什么?关于是不是oop比纯函数在二次封装这5个包时候比例更高,这一点可以多找找网上的公开代码和pypi官网中随便找几十个数据库二次封装的包来证实。

不管写得好坏,使用百度搜索,贴出一些使用python来二次封装操作mysql selnium的文章地址

Python一个简单的数据库类封装

LightMysql:为方便操作MySQL而封装的Python类

python mysql 封装

python连接mysql数据库封装

Python封装的访问MySQL数据库的类及DEMO

selenium基础框架的封装(Python版)

Python_selenium二次封装selenium的几个方法

史上最强大的python selenium webdriver的包装

selenium + python自动化测试unittest框架学习(五)webdriver的二次封装 (唯一一个使用函数)

Day17-selenium的二次封装

webdriver+expected_conditions二次封装

贴出的11个有10个使用了类,有一个使用函数,所以可以看到,二次封装这些东西时候90%的人也会使用类。这个使用函数封装的人正是中了我说的不写类的原因里面的第二个原因的圈套,既减少重复传参,该文章由于既不愿意把driver写成全局变量,也不愿意使用类,所以把driver变量作为了几十个函数的第一个参数,如果再增加几十个函数,会反复传参几百次。

python mysql redis mongodb selneium requests二次封装为什么大都是使用类的原因,一点见解的更多相关文章

  1. Redis进阶实践之九 独立封装的RedisClient客户端工具类(转载9)

    Redis进阶实践之九 独立封装的RedisClient客户端工具类 一.引言 今天开始有关Redis学习的第九篇文章了,以后肯定会大量系统使用Redis作为缓存介质,为了更好的更好的Redis,自己 ...

  2. python连接MySQL/redis/mongoDB数据库的简单整理

    python连接mysql 用python操作mysql,你必须知道pymysql 代码示意: import pymysql conn = pymysql.connect(host='127.0.0. ...

  3. Linux下安装python,mysql,redis

    linux 安装Python3 1.python下载 请在终端输入如下命令: cd /home wget http://cdn.npm.taobao.org/dist/python/3.6.5/Pyt ...

  4. 源码包安装(Python mysql redis)

    一  源码包安装 (1)python3.6源码包安装 ./configure ------> 定制功能 make make install mysql 源码包 cmake make make i ...

  5. python+selenium十:selenium的二次封装

    python+selenium十:基于原生selenium的二次封装   from selenium import webdriverfrom selenium.webdriver.support.w ...

  6. Python操作MySQL+Redis+MongoDB

    1-1 python操作三大主流数据库导学篇 1-2 数据库简介 1-3 MySQL简介 2-1 MySQL安装及配置 2-2 MySQL图形化管理工具 2-3 SQL语法基础-创建并使用数据库 2- ...

  7. Open-Falcon 监控系统监控 MySQL/Redis/MongoDB 状态监控

    背景: Open-Falcon 是小米运维部开源的一款互联网企业级监控系统解决方案,具体的安装和使用说明请见官网:http://open-falcon.org/,是一款比较全的监控.而且提供各种API ...

  8. 监控MySQL|Redis|MongoDB的执行语句(go-sniffer)

    上节回顾:https://www.cnblogs.com/dotnetcrazy/p/9986873.html 以CentOS为例: 1.环境 PS:如果不需要Golang环境,可以编译后把执行文件c ...

  9. centos7.4下搭建JDK+Tomcat+Nginx+Mysql+redis+Mongodb+maven+Git+Jenkins

    先干两件大事!先干两件大事!先干两件大事! 1.关闭selinux [root@mycentos ~]# vi /etc/selinux/config SELINUX=disabled 2.关闭防火墙 ...

随机推荐

  1. 伪造请求IP

    //随机IP function Rand_IP(){ $ip2id= round(rand(600000, 2550000) / 10000); //第一种方法,直接生成 $ip3id= round( ...

  2. 你不知道的js

    1.<a>标签 (1)href属性包含超链接或超链接指向的URL或URL片段,URL 片段是哈希标记(#)前面的名称,哈希标记指定当前文档中的内部目标位置(HTML 元素的 ID).URL ...

  3. 使用HttpClient请求,问题记录

    上篇博客说到使用单例HttpClient,以GET请求方法为例.可以看到对于Http请求头中Authorization参数,会根据传入的accessToken是否为空来判断是否添加此请求头. publ ...

  4. android:碎片的生命周期

    和活动一样,碎片也有自己的生命周期,并且它和活动的生命周期实在是太像了,我相 信你很快就能学会,下面我们马上就来看一下. 4.3.1    碎片的状态和回调 还记得每个活动在其生命周期内可能会有哪几种 ...

  5. Unity3D光照前置知识——Rendering Paths(渲染路径)及LightMode(光照模式)译解

    简述 Unity supports different Rendering Paths. You should choose which one you use depending on your g ...

  6. 最课程学员启示录:这么PL的小姐姐你要不要

    最课程学员启示录:这么PL的小姐姐给你做……你要不要? 想撒呢,给你做程序媛你要不要? 一句话,先上图,而且必须是经得住考验的素颜无码高清大图身份照: 我觉得未来我们可以搞个校花评选,你们不反对的话, ...

  7. 解决Matlab画图直接保存.eps格式而导致图不全的问题

    Matlab确是一款简单方便的工具,使用此工具绘图也是我们常用的一种手段,可是如果我们想将此图片保存成.eps格式并应用于latex中,就有可能会出现.eps格式的图片显示不全的问题,这个着实让我们头 ...

  8. 这个Linux命令是干什么的?

    笔者遇到一个命令,觉得挺不好懂的. find . –type f –exec dd if={} of=/dev/null bs=128K status=none \; 这个命令中: {} 代表着被找到 ...

  9. SSH框架搭建详细图文教程(转)

    这篇文章看的我醍醐灌顶的感觉,比之前本科时候学习的SSH架构 要清晰数倍  非常感觉这篇博主的文章 文章链接为:http://blog.sina.com.cn/s/blog_a6a6b3cd01017 ...

  10. SRS流媒体服务器安装配置

    SRS全称Simple RTMP Server,定位是运营级的互联网直播服务器集群,是一个非常简单就可以推送rtmp视频流的服务器. github主页:https://github.com/ossrs ...