非程序员的编程之旅——Python基础篇(6)面向对象

作者:李禹锋,重庆芝诺大数据分析有限公司数据挖掘工程师。

非程序员的编程之旅——Python基础篇(6)面向对象_第1张图片

        上一篇结尾谈到了面向对象编程,这其实是现在编程的一个主流思想,一个封装的思想。本系列并不要求同学们学会如何进行封装,所以本节最主要在于理解类、对象是什么即可,有兴趣深入学习的同学在后面实战篇里可以把知识点自行进行封装。

非程序员的编程之旅——Python基础篇(6)面向对象_第2张图片

本文导读

非程序员的编程之旅——Python基础篇(6)面向对象_第3张图片

        前文所讲述的函数仅仅是对于某一个功能的封装,本文所讲述的类,将会是一个更高层面的封装。简单一些理解就是将有相同或类似特征,相同或类似的处理函数的一系列东西进行一个抽象,抽象成一个模板(类),下一次遇到类似的东西的时候,我不用重新编写处理函数,不用重新定义有哪些特征变量,直接对这个模板进行实例化(创建对象)。

非程序员的编程之旅——Python基础篇(6)面向对象_第4张图片

        咳咳,学习数据分析写的程序不需要面向对象,不过理解什么是面向对象很重要,不然新出一个框架就看不懂怎么用了。稍微举个例子,前面讲到的列表,列表类型在python中便是一个类,它内部有各种列表的处理函数(方法),也有列表的一些特征(例如列表长度)。但是现在的列表还属于一个抽象中的东西,当我们使用list创建出一个真实的列表的时候,那么列表的各种方法、特征都将会适用于所创建出的真实列表。

非程序员的编程之旅——Python基础篇(6)面向对象_第5张图片

(来自excel的嘲讽)

01

初始类

在python中使用class关键字定义类。

非程序员的编程之旅——Python基础篇(6)面向对象_第6张图片

有几个知识点。

1、类里直接设定的变量(如上文的字符串a),使用范围仅仅只有这个类里,该类里的所有方法(函数)均可调用。


2、类里定义函数第一个参数必须传入的是这个类本身,表示将这个函数绑定到这个类里,而self并不是python中的关键词,我可以随意取一个名字,只是用self表示能够更清晰的表示出方法中传入的第一个参数是这个类本身,例如下图。

非程序员的编程之旅——Python基础篇(6)面向对象_第7张图片

3、在类里的函数调用本类的变量时,一定要加上2中所说的self(或你自己取的指向本类的那个参数)。不过需要说明的是,self绑定的实际上是对象,而不是整个类(如果绑定的是整个类,那么会污染整个类的变量,那么下次再实例化对象的时候变量就不是一个父级关系),确实搞不明白就暂时放在一边,反正记着一点把类实例化成对象并不能修改类,把上图中的类稍作修改来演示这个功能,如下图所示。

非程序员的编程之旅——Python基础篇(6)面向对象_第8张图片

        可能这样来写还是会有不少朋友不明白使用类的作用在哪里,和对象有什么关系。就拿上面那个例子来说,模板就是myClass,其中有一个大家共用的变量a(可以进行修改),有一个大家共用的方法b。在下面和定义类同级中实例化myClass的时候,我采用a来作为myClass接地气的接收器,这就是实例化了一个对象。我们编程都是通过各种类实例化的“a”来进行串联起来的,所以叫做面向对象编程。

至于作用在哪里,我再拿上一篇爬虫的模型进行一个扩展。

非程序员的编程之旅——Python基础篇(6)面向对象_第9张图片

        当然,按照上图中的那种方式,也并不能看出类到底有什么作用,甚至这样来写比上一篇中的代码还要复杂一些了。同时另一个问题是,像是实例化一个列表对象的时候,不是也可以传入参数这一类的吗?这就是接下来要讲到的构造函数。


02

构造函数

        Python里并不像Java语言一样有各种权限控制,什么public、private等等都没有,但也有一些方法可以创建出一些隐藏起来的参数。其中最常用的就是使用各种下划线--->  _  <---,比如前一篇里面使用的__name__(前后各两个下划线)就是一个隐藏的全局变量。


        在类中,使用__init__来表示构造函数。将我们在实例化对象所要传入的参数,前文例子中的字符串a和url都是固定值,还没有进一步抽象到特征上。下图同样以爬虫模型为例。

非程序员的编程之旅——Python基础篇(6)面向对象_第10张图片

        上图中的类仅需要改变创建对象时传入的url就可以爬取不同的网页(当然解析代码部分还需要深究,因为网页结构不尽相同,使用同一个解析函数是不现实的)。


        这么做的好处,如果想自己写个程序之后以最小的改动实现强大的功能,那么把自己的代码封装到类里是一个很好的选择,之后要使用的时候,甚至都不需要改动类的源码(类的源码属于底层代码),只需要改变传入的参数值(这个传入的参数就是前篇所说的API、接口,在类里就是构造函数的使用)。


        插播一个小知识,init在python中使用较多,下一篇模块中也会有使用到,其实是initial的缩写,意思为初始化。在R语言中所有的东西都是对象(有特征,有方法),只是没有提供简便创建类的方法。

03

类的深入操作

        首先要讲解的是类的继承问题(就是可以把定义好的类的家产一股脑的传递给下一个类)。在以前python版本里,定义类时还必须继承一个object类,Python3将object类封装进了class关键词中,所以python中所创建的所有类都是继承自object类的子类。


        继承有传承和覆盖两个特性,即子类里有父类的所有特征和方法,同时子类里可以对父类的特征、方法进行修改,可以定义一些新的特征、方法。具体拿代码来演示。

非程序员的编程之旅——Python基础篇(6)面向对象_第11张图片

        上一篇提及了help函数,同样对于类也是适用的,就拿上图中的father类来演示一下。

非程序员的编程之旅——Python基础篇(6)面向对象_第12张图片 非程序员的编程之旅——Python基础篇(6)面向对象_第13张图片

        一开始看起来可能会有一些懵逼,但是一行一行的看下来,发现其实就是我们自己定义类的结构,有哪些参数,有什么方法,方法下面的说明就是我们用多行注释进行书写的。(也可以来一只神兽或者HelloKitty)

类也有更多的拓展知识,但目前学到这些部分就足够了。


        最后再重申一下,做数据分析,更多需要的是上层应用,仅针对对底层感兴趣的同学或想自己以后用自己写的包、模块、框架(别人的框架始终是别人的,不管金窝银窝,都没自己的狗窝舒服,为啥是狗窝?因为找不到。。。)。但是对于理解面向对象对于python的编程也是非常重要的,同时之前也说过计算机语言都是相通的,Java、JS、Go、C++、C#、PHP等等语言都是通过面向对象进行编程的,理解了计算机思想,很快就能上手一门语言。

非程序员的编程之旅——Python基础篇(6)面向对象_第14张图片

人生苦短我选python,本系列持续更新中,有疑问、有需求、有指教的朋友可留言或向公众号后台发送消息,后台小姐姐会及时处理并回复的。

非程序员的编程之旅——Python基础篇(6)面向对象_第15张图片

      重庆芝诺大数据分析有限公司是国内首批大数据技术应用解决方案的专业服务提供商,是中国商业联合会数据分析专业委员会事务所会员单位。公司基于Apache Hadoop 框架,自主研发的大数据综合分析处理平台—Zeno Data Matrix平台,提供一站式大数据开发环境和工具,包括数据抓取、清洗、储存、分布式计算、分析挖掘及可视化应用的整体解决方案。快速部署,整合数据信息,盘活数据资产,为政府、企业的经营决策提供科学支撑。

     芝诺数据现拥有近20项自主知识产权的软件专利。拥有大数据综合分析处理平台(ZDM平台)、大数据教育(实训)平台、重庆市安全生产综合服务平台、四点半课堂等。

640?wx_fmt=jpeg


你可能感兴趣的:(非程序员的编程之旅——Python基础篇(6)面向对象)