最近一直在自学Python,在《Python学习手册》的开篇有一句话——“Python可以定义为面向对象的脚本语言”。
这句话让我十分困惑,并且在之后的一周里面让我总是混淆一些概念,到底什么是“面向对象”?到底什么是“对象”?
带着这个疑问,我继续向下学习,查阅了相关资料,直到我在书中找到了这么一句话——“一切皆对象”。我瞬间感觉就像是一束光照进了黑暗的房间,豁然开朗。这句话的大概意思就是你在Python中输入放入一切、在Python中看到的一切都可以称之为“对象”。
讲到这,“对象”这个概念我已经了解了,我继续向下学习,又遇到了一个难题,在书中的某一章中对比了Python和C、JAVA的区别,其中有一点是这样的:
Python——面向对象的语言
C——面向过程的语言
看到这我又开始迷惑了,“面向对象”和“面向过程”到底又是个什么意思呢?我又开始翻书、查资料、知乎,直到我在相关问题下看到了@完美龙小猫的一篇回答:
面向过程是编年体;面向对象是纪传体。
在读到这一句话的瞬间,我又感觉像那束光再次照亮了黑暗的屋子,又豁然开朗起来。在此我先解释一下纪传体和编年体的区别。
首先编年体是以年代为线索编排有关历史事件,编年体史书以时间为中心,按年、月、日顺序记述史事,简而言之就是我按时间顺序把一段历史写下来,某某某在什么时间先干了什么后干了什么,接下来要干什么。要记叙的所有东西事先都按时间顺序已经排列好了,我们要做的就是填写在什么时间这个具体的事情是如何发生的。
而纪传体则是以为人物立传记,像司马迁的《史记》就是这一类型,简而言之就是把一段历史分为不同的块,这段历史都是谁参与的,谁做了什么,综合这些人物的块你就可以描述出这段历史的大致样貌。
讲到这,我想那些有编程经历的人或许应该已经明白了“面向对象”和“面向过程”的区别,下面我就具体举一个例子来说明这个问题。
首先我们要明白一个概念,即面向对象编程语言中的“块”。学过Python的人应该都知道Python中一个非常经典的语句:
import xxx
即导入一个模块,这个意思就是说我事先在这个模块下实现了某个功能,你现在要用到这种功能就不需要重新编写一遍,你只需导入我写的这个模块就可以实现你想要的功能了。
好了,我们开始我们的例子。
现在比如让你编写一个机械手臂来打开冰箱取东西的程序。(别担心这里不会出现具体代码,事实上我也是初学者,并不会编写这一段代码。)
那么面向过程编写的代码是这样的:
1.函数f1(机械右手,冰箱):机械右手打开冰箱。
2.函数f2(机械左手,要取的东西):机械左手拿出东西。
3.函数f3(机械右手,冰箱):机械右手关上冰箱。
而面向过程是这样的:
首先定义一个对象——机械手臂,机械手臂具有两个属性,即机械左手和机械右手。接着写出三个方法,即打开冰箱,拿出东西,关上冰箱。
1.机械右手调用方法——打开冰箱
2.机械左手调用方法——取出东西
3.机械右手调用方法——关上冰箱
通过对比以上两种实现机械手臂来打开冰箱取东西的方式,我们可以看出,“面向对象”和“面向过程”的区别:
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
面向对象”和“面向过程”各有优缺点,但是由于我是学习的面向对象的Python,这里我讲一下面向对象的优点,还是上一个例子,上面例子中的机械手臂是左手拿出东西,我们假设这个机械手臂是一个左撇子,那么要是一个右撇子来打开冰箱该怎么办呢?
如果你是面向过程设计,那么机械手臂的规则就分布在了你的程序的每一个角落,要改动还不如重写。但是如果你当初就是面向对象的设计,那么你只用改动规则对象就可以了,即如下过程:
1.机械左手调用方法——打开冰箱
2.机械右手调用方法——取出东西
3.机械左手调用方法——关上冰箱
我们只需把左右手的顺序调换一下即可,不需要像面向过程语言那样重新编写一遍程序。当然面向过程也有着自己的优点,在这里我就不多赘述了,我要去学习Python啦啦啦啦!
如果你也想入门高薪Python人工智能行业,欢迎你来到达内学习。
领取专属 10元无门槛券
私享最新 技术干货