在上一篇《手把手陪您学Python》38——第二阶段小结中,我们对之前所学的内容进行了总结,接下来,我们将会用几篇文章,为大家介绍一种Python中非常重要的编程方法,或者说编程思想。
为什么说是编程思想呢,因为他并不涉及新的语法、命令、函数等,只是在之前我们学习过的知识的基础上,通过改变程序的结构、运行逻辑、执行顺序,甚至是改变程序的核心主题,来实现一种全新的思维方式和编程逻辑,也就是面向对象编程。
上面这段话可能不是很好理解,甚至可能不是很准确,因为他只是我对于这种全新的编程思想的描述。
说实话,这一部分的内容要理解起来可能会比之前我们学习的内容要难得多,包括我自己,也是好几次准备开始学习这个主题,看不懂,放下,过一段时间,再重新拿起来,还是无法理解,又放下。就这么反反复复的有了大半年的时间,最近才终于有了顿悟的感觉,理解了其中的含义,也才敢继续更新《手把手陪您学Python》这一系列文章。这也是除了疫情和工作原因,断更半年多的一个重要原因。
因为如果不把这点吃透了,实在不敢违心地继续陪大家一起学Python。虽然也可以把这块隔过去,但是从整个学习的逻辑性和完整性上来说,就是不那么完美了。
所以,我也会尽可能地在接下来的几篇文章中,把面向对象的编程方法和编程思想,用最为通俗(有可能会比较啰嗦)的方式介绍给大家,希望大家也能够尽快地理解和掌握。
当然,刚才也说了,对于面向对象我也是刚刚才学习有所了解的,如果在介绍过程中,有什么不准确的地方,还希望大家能够多多包涵,并提出宝贵建议,我也会在后面的文章中,及时勘误,并把我新的学习体会再分享给大家。
因为这块内容确实有点难,如果大家在学习的过程中有什么理解不了的,欢迎随时留言一起讨论,希望可以帮助大家尽快攻克这个难关。
也可以像我之前一样,先放一放,继续学习后面的内容,也不会有什么影响,过一段时间再回过头来看看,相信最多有几次反复,大家肯定就能理解了。
以上就是我的一点经验和建议,在开始学习面向对象前与大家分享一下,希望能够对大家后面的学习有所帮助。
下面,就正式开始面向对象编程的学习,大家加油!
1、编程的两种方法:
刚才说,面向对象是一种新的编程方法或者说编程思想,那么原来我们是用什么方法和思想在编程呢?
那就是面向过程,包括我们之前在学习基础知识的过程中所列举的实例,以及“石头剪刀布”和“猜数字”两个比较大型的(相对于其他实例来说)程序,都是基于面向过程的方式在编写程序。
那么什么是面向对象,什么是面向过程,两者之前的差别又是什么呢?
2、面向过程
首先,从字面上看,面向过程更为容易理解,就是以过程为中心。要实现什么目标,需要先怎么样,再怎么样,才能怎么样。更通俗一点就是,要到D点,要从A出发,经过B,再到C,最后到达D。
如果以我们之前的“石头剪刀布”做例子,就是要知道谁赢,需要先设定比赛规则,然后让用户出拳,再让计算机出拳,最后根据规则判断输赢。
整个程序设计的出发点,和我们考虑一件事的发生顺序是一致的,这就是以过程为中心的编程思想,也就是面向过程。
3、面向对象
由此可知,面向对象就是以对象为中心。
这个对象就是我们大千世界中的万事万物,可以是我们桌面上的一个水杯,也是可以是海里的一条鱼,还可以是一次漂亮的投篮,或者是说不清道不明的爱。
总之,一切可以言说、不可以言说、具体的、抽象的东西,最终都可以称之为“对象”。
所以,面向对象的编程就是以这些“对象”为核心的编程方法。
4、区别
当我们采用面向对象的编程方法时,要考虑的问题就不再是“先怎么样再怎么样”了,而变成了“什么(即对象)是什么(属性)能干什么(方法)”。
括号里的解释是为了区分几个“什么”的含义,后面会具体讲到,这里可以先不用理会,关键要体会“什么是什么能干什么”这段话。
再和“先干什么、再干什么、最后干什么”比较一下,是否能感觉到一些差别了?
前者在介绍这个什么(对象),而后者在关心怎么做(过程)。
这就是面向对象和面向过程的差别。
例1、石头剪刀布
如果不理解,我们再以“石头剪刀布”为例,看看如果从面向对象的角度出发,这个程序有哪些对象,又应该如何设计。
首先,最重要的对象就是参赛选手(对象)了,用户是参赛选手(实例化),电脑是参赛选手(实例化)。参赛选手能干什么呢?能“出拳”(方法)。
这里的括号同样先不需要关注,等后面讲过这些概念后,再返回来看就能明白其含义了(下同)。
另外一个对象是规则(对象),规则是什么呢?是“石头赢剪刀,剪刀赢布,布赢石头”(属性)。规则能干什么呢?“判断输赢”(方法)。
好了,现在所有的对象都已经就位了,对象是什么、能干什么也清楚了,下面就是我们组织程序的过程了。
首先,用户出拳(用户.出拳);其次,电脑出拳(电脑.出拳);最后,规则判断输赢(规则.判断)。
看到这,大家是不是就会问了,这看上去这也是个过程啊,和之前没有什么两样啊?
没错,这确实是个过程,毕竟我们比这个“石头剪刀布”的本身就是一个过程,不可能改变其先出拳后判断输赢的顺序。
但大家注意没有,这个过程却是以对象为中心的,这是和面向过程的过程的最大差别。
大家可以回过去看看面向过程里的这段游戏是如何描述的,是“设定”比赛规则,然后“让”用户出拳,再“让”计算机出拳,最后根据规则“判断”输赢。
每一个过程都是以引号中的过程为核心的。
而面向对象的描述方法呢,是“用户”出拳,然后“电脑”出拳,最后,“规则”判断输赢。
每一个过程都是一个对象(用户、电脑、规则)发起的,都是在描述对象做的事(出拳、判断),最后把所有对象做的事情按照先后顺序连起来,形成一个完整的程序。
讲到这,不知道大家有没有理解了一些。下面我们再用一个例子,继续体会面向对象和面向过程的区别。
例2、洗衣服
如果我们有衣服要用洗衣机洗,这个过程应该是什么样的?
我们最先想到的,应该就是面向过程的方式:
1、打开洗衣机门
2、把衣服放进去
3、关上洗衣机门
4、启动电源
5、清洗衣服
6、甩干衣服
7、烘干衣服
和“石头剪刀布”中的过程一样,都是一个个动作按照先后顺序组合起来的,谁开门,谁洗衣服在这里不重要。
如果是面向对象,我们首先要想到的不是先干什么后干,而是什么(对象)能干什么(方法)。
这里的对象显然就是人和洗衣机,分别地,人能开门、放衣服、关门、启动电源,洗衣机则能清洗、甩干和烘干。
之后才是洗的过程,而且这个过程是以对象为核心的,或者说要以对象为出发点去执行:
1、人打开洗衣机门(人.打开洗衣机门)
2、人把衣服放进去(人.把衣服放进去)
3、人关上洗衣机门(人.关上洗衣机门)
4、人启动电源(人.启动电源)
5、洗衣机清洗衣服(洗衣机.清洗衣服)
6、洗衣机甩干衣服(洗衣机.甩干衣服)
7、洗衣机烘干衣服(洗衣机.烘干衣服)
虽然还是同样的过程,但每一个动作都是由对象去执行的,“谁”干了什么的“谁”才是最重要的。
以上分别从字面理解和两个例子,向大家介绍了面向过程、面向对象以及他们之间的差别。
就像我一样,第一次接触这些概念一定会很蒙的,尤其是没有看到太多这样的例子,所以很难体会到他们之间的差别。
好的是,根据我的理解,给大家通俗地解释了两个概念的异同,并用例子作为对比说明,可能理解起来就会更加容易一些了。
但如果初次接触可能依然比较难以理解,不过没关系,就像我们开头说的,可以先放一放,过两天再来看一遍,或者继续学习后面的内容,再返回来学习,可能就会有不一样的认识了。
后面我们还会继续讲解面向对象的编程方法,只不过就不像这篇文章一样都是通俗的概念讲解了,而是要进入到面向对象编程的具体结构和编写规则了,同时也就能明白今天文章中很多括号里的文字的意义了,敬请关注。
感谢阅读本文!如有任何问题,欢迎留言,一起交流讨论^_^
要阅读《手把手陪您学Python》系列文章的其他篇目,请关注公众号点击菜单选择,或点击下方链接直达。
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Python》5——Jupyter Notebook
For Fans:关注“亦说Python”公众号,即可免费下载本系列文章所用示例语句。