Data Scientist生产力进阶—Python OOP编程快速入门
面向对象编程 (OOP) 是一种计算机编程模型,是几乎每个开发人员在职业生涯的某个阶段都使用的基本编程范式。 它围绕数据或对象来组织软件的设计。
今天,我们就带大家了解以下几点内容.如果你想了解更多数据分析相关内容,可以阅读以下这些文章:
如何准备数据科学的现场编程面试?
微软数据科学家面试,都问什么SQL问题?
六条鲜为人知的SQL技巧,帮你每月省下100小时!
数据分析新工具MindsDB–用SQL预测用户流失
1. 什么是OOP,它有什么特性
2. 如何在Python中创建object
3. OOP在数据科学领域的优势
4. OOP在数据分析领域的实际使用案例
OOP是一个抽象的概念,主要用于我们想要解决的一些现实问题。一般这种时候,我们会希望将现实问题代码化,这个模式就是将现实中的物件代码化,每一个物件会拥有自己的特性和一些动态的行为,比如下图Human这样的对象(object),它可能会自带一些特性,像E-mail、Address等等。
同时,她也会拥有一些动态的行为,比如这个Human本身可以发送邮件,可以识别她的身份。抽象来说,这样我们就是订阅了一个object。
OOP有三大特性:继承(Inheritance)、封装(Encapsulation)、多态(Polymorphism)。
那么,如何在Python中创建对象(object)呢?
以Employee为例,假设我们今天想要在Python中创建一个名为Employee的object,首先我们要先了解,Employee都会有哪些属性?
常见会有姓名、年龄、薪资。在Behaviors方面,我们会希望显示关于这个Employee的一些基本资讯,同时,我们也想要知道当前这个Employee的人数,比如某一个公司肯定会记录所有Employee的数量,这个就是一个很好的方法。
以上图右边的代码图为例,我们会创建一个class叫Employee。这里需要注意的一点是:当我们在Python中创建任何class的时候,第一个字母一定要大写。接下来我们会创建一个empCount为0,当我们想要定义这些属性在Python中的时候,我们可以写上这些name、salary,同时每当一个新的Employee被创建的时候,我们需要增加Employee的Count。
接下来,Employee底下会有一些method,第一个是displayCount,可以显示当前这个Employee所有数量,再来是displayEmployee,这个method会单纯的显示这个Employee的资讯(名字和薪资)。
创建好class之后,就要开始思考我们怎样去调用它。在Python中,我们会创建一个新的实例(instence)来调用这个class。比如我们创建一个Emp 1,它可以调用Employee这个类(class),Employee会有name和salary,所以我们在创建的时候,必须要属于这个实例的Employee的资讯。比如第一个Emp 1,名字是Chris,薪资是1000,Emp 2的名字是Tony,薪资是2000。
当我们创建完这个instence之后,就会想调用class里面的一些method,比如当我们使用Emp 1.displayEmployee()调用method的时候,会显示Emp 1的基本资讯,使用Emp 2.displayEmployee()调用method的时候,会显示Emp2的基本资讯。
如果我想要知道当前我创建了多少Employee的时候,可以直接调用displayCount,并且无论用Emp 1或者Emp 2去调用displayCount,都会显示两个,为什么呢?是因为当前class的Count是一个Global variable,每一次在创建Employee的时候,这个Class都会递增Employee的Count。
接下来,我们来了解一下三大特性,首先是第一个:继承(Inheritance)。我们什么时候会使用继承这样的概念呢?是当我们想创建多个类似的Class的时候,比如右边这张概念图,首先可以有Animal这样的Class,Animal底下会有Dog和Cat,我们可以理解为Dog和Cat都会继承Animal所有的一些性质和行为,但Dog和Cat本身会有自己的一些行为。
在代码这边,我们假设今天会有一些父类(Parent Class),同时也有一个全局变量(Global Variable)parentAttr=100,定义一个属性(Property)叫name,Parent method的功能就是直接打印“I am parent”,setAttr是用来更改parent的,getAttr是可以直接显示这个ParentAttr为多少。底下我们会创建一个子类(Child Class),我们如何让这个子类继承父类拥有的特性和行为呢?我们必须在Child这个Class里面传入parent的Class,当我们Child这个属性里面想要继承所有parent的性质的时候,我们会用到Super这个方法,它会用和上面一样的方法去记录,可能还有一些其他的Child method。
我们来看实际案例,我们创建了一个Child实例叫tommy,然后,当我们打印Tommy名字的时候,它会自动显示“Tommy”。Child Class可以调用Parent Class储存name的形式,如果用C.Child method,它就会自动Print“I am child”,同时你会发现,Child这个实例也可以直接使用Parent Class里面的method。另外,你也可以直接使用Child method去设置属性,把数字设置为200。
第二个特性:封装(Encapsulation)
一个对象(Object)会包含它自己所有的数据,类(Class)会将所有数据封装在这个“胶囊”里,胶囊里有它自己的变量(Variable)和方法(Methods)。我们并不需要详细了解Methods的创建过程,当我们直接调用这个Class时,只需要传递进来我们需要的参数,就可以直接使用这个Class。
在封装里,Class会有一些自带的Methods,常见的有getattr、hasattr、setattr、delattr——getattr会返回一些class的属性,hasattr会确认Class是否有这个属性,setattr是想更改这个class在初始化method的一些属性,delattr是删除class里的一些属性。
为什么我们在创建Class时会创建这四个Method,是因为我们并不想直接篡改Class,所以,我们会通过调用Class的Method来做数据的篡改。这样的好处是,当我们想要做一些更加复杂的开发时,这可以提高代码的安全性。上图右边有一个例子,我们创建了一个Computer的Class,它的属性有price,有sell method,会显示“Selling Price:900”,然后会有setPrice method,设置computer的价格,getPrice是显示当前computer的价格。
第三个特性:多态(Polymorphism)
在不同的class里method会有不同的格式,但它们做的事情是一样的。比如,有一个Shape的Class,它可能有Circle、Rectangle、Square三个子类,这些Class的共同点是都有draw()这个method。但是,当我们调用每一个class的draw method时,Circle会画一个圆,Rectangle会画一个长方形,Square会画一个正方形。虽然它们同样是draw,但是画出来的结果却不一样,而method却是在所有Class中都能通用的。
Code如左图所示,Shape中有area和getName,Rectangle中的super()有继承的概念,会继承Shape的所有属性和method,有自己的长度,宽度和面积,然后Square和Circle也是同理。虽然Shape和Rectangle都有area这个method,但是会显示不同的结果。
当我们了解完OOP所有的特性之后,让我们再来看一下OOP的使用优势。
1. 当我们对Class了解后,我们把某一样东西以拟物的形式封装起来,那么code会容易理解,简单清晰。
2. 因为Class是可以分享的,代码的重复使用性会很高,不需要再复制粘贴一样的内容,在新的Class里我们可以直接做一个继承。
3. 因为OOP本身有封装的特性,所以我们会知道数据会永远封装在class里,整个代码会更加安全和稳定。
4. 因为多态可以在不同的class里面使用一样的method,减少代码的重复,会更加高效。
这里有一个小技巧,Function可以在任何一个地方定义和调用,但是如果你调用class的method,你必须先创建class,然后再使用instance调用。
接下来,我们了解一下OOP在数据科学的应用。
- 1. 一般数据科学人士可能没有编程背景,很多时候大家可能会盲目地使用这些library的methods,而不知道library本身的构造模式是什么。虽然这样也可以,但是当你遇到问题时难以解决。
- 2. 当我们做数据分析时,虽然我们可以调用pandas、numpy等库,但是在不同公司工作时,会做一些特定的数据处理,在特定的处理下会创建自己的package,创建的package也可以分享给同事共同使用。比如,组里面的组员同样也想要做clean的时候不需要自己写一遍clean的过程,可以直接调用你自己封装的包里面的方法来做清洗。
- 3.帮助完成一些个人项目。OOP的这个形式在做一些项目的时候也是很好用的,比如说,可以自己做一些网页抓取,当想要去网页上面抓取一些数据的时候,可以把网页抓取的过程写成一个oop的形式。
- 4.让在与其他队友一起工作时更有组织和标准化,用OOP的形式,代码会更加的简洁、清晰,和同事分享代码的时候也会更加的标准化。
最后,我来分享一下OOP在实际使用过程中的案例。在实际的工作运用场景中,在机器学习模型中,比如一个线性回归的模型(如下图)大家可能会有疑问:为什么不直接调用sklearn的模型呢?
原因是,我们在现实工作中使用模型时,并不想要直接使用标准化的模型,可能会需要对模型做一些处理。比如说,数学的某一些公式的部分我们需要做一些变化,这时就很适合自己把模型用class的形式写出来;
第二,当我们想要做数据清洗的时候,并不想重复写一样的代码,那么,我们把数据清洗的步骤写成一个class,在之后用调用的形式去清洗数据,这样能帮助更快的完成工作。哪怕之后忘记了数据清洗的过程,但只要数据格式是类似或者一样的,就可以直接调用数据清洗的object来直接做数据清洗;
第三,当我们想要处理的一些数据是从一些API得到的,假设它是Json format的数据,我们想要做一些处理把它转换成table的形式,并且提取有用的之后数据处理,会用到的一些columns,那么从Json文件里把它提取出来之后,整理干净再存进数据库,这个很长的过程也是可以使用class的形式进行封装;
最后一个网页抓取,简单来说,比如今天我想查找所有车子的模型的价格,之后想要分析近10年来这些车子价格的变化,这些数据可能是从一个一个车辆销售网页拿下来的数据,网页抓取的过程也是可以使用class这个形式封装这个过程,然后把有用的数据存进数据库里面,最后再做一些查询分析。
总结来说,在数据类工作的日常中,如果你了解了OOP的概念,可以试着去复刻一些如机器学习的模型的过程。随着职业的发展,如果你在后期想成为一个机器学习工程师或者转做AI相关的岗位,理解这些模型的过程是非常重要的,能更有效的帮助完成工作。
以上就是本文的全部内容!欢迎你进一步研究Python OOP,为你的数据科学生涯打下更坚实的基础!你还可以订阅我们的YouTube频道,观看大量数据科学相关公开课:https://www.youtube.com/channel/UCa8NLpvi70mHVsW4J_x9OeQ;在LinkedIn上关注我们,扩展你的人际网络!https://www.linkedin.com/company/dataapplab/
Recap 作者:数据应用学院
美工编辑:过儿
校对审稿:佟佟
公开课回放链接:https://www.youtube.com/watch?v=xKL1u8hF8rI