论光棍的最高境界:一切皆对象

论光棍的最高境界:一切皆对象

  之前在揭开“神秘的面纱”一文中有提到,python是“平易近人”的,是“接地气”的;它的“接地气”不仅体现在其语法的精简上,更重要的是它采用了面向对象这一编程范式,这让它离机器更远一步的同时,离我们更近了一步。  

  为了让大家更好地理解一切皆对象这一境界的具体内涵,我在此就面向对象与面向过程这两种编程范式的概念分别做个说明,并由此引申出面向对象、面向过程、机器、程序员这四者间的“爱恨情仇”。

  面向过程。什么是过程?过程就是完成某个事件的动作,这个动作可以按照先后顺序拆解成一个个简单的步骤。举个简单的例子:要如何把一头大象装进冰箱。把大象装进冰箱是一个动作,而这个动作可以具体分解成三个简单的步骤:1、打开冰箱。2、把大象放进去。3、关上冰箱。你看,其实就是这么简单。或许你会问:把大象装进冰箱(Are you kidding?!)?有这么大的冰箱吗?你又要怎么把大象“放”进去?其实这些问题我也知道,但是!如果执行这个动作的是并没有人类思维的机器,则这些问题都不会是它该考虑的,它只会根据指令完成这一动作,那就是“打开”——“放进去”——“关上”。这就是面向过程的实质,复杂些的面向过程动作可以参考顺序、选择、循环这三种逻辑来进行。C就是一种采用面向过程范式的编程语言,在代码过多(程序体量过大)时为了增加可读性与资源利用率,其采用了函数的方式对各个不同的动作进行“打包”,然后再对“打包”过的动作根据需要按照既定的逻辑(可采用顺序、选择、循环)执行,直至程序功能实现。C语言运行的程序,其面向过程的实质始终不变,变的是实现面向过程的基本单元,它可以是单个语句(单个指令),由多个语句组成的一个动作(“打包”后的,也就是函数),甚至由多个动作组成的更大的一个动作(包含多个函数的函数,但是会因此导致传入的参数过多以造成臃肿)

  面向对象。什么是对象?对象就是一个独立的个体(不然怎么和对象谈恋爱啊,怎么和对象深入交流啊),他/她会有自己的名字,有自己的特征(身高体重性格爱好什么的),也可以独立完成某些动作(处对象总要可以打kiss吧,不然真是太绝望了),这种独立的个体就可以称之为对象。同样是如何把大象装进冰箱这个问题。我们可以在这个问题中找到三个对象:1、完成把大象装进冰箱这个动作的人(暂是叫他A吧)。2、大象。3、冰箱。这么一划分,各种头脑风暴就来了。A可以是一个力气超级大的大力士,长得非常魁梧,他可以直接把大象抱起来,完成放进冰箱这一动作;也可以是具备某种大型机械设备操作能力的人,利用大型机械设备(超大挖掘机?)完成把大象放进冰箱这一动作...诸如此类,可以有很多种可能。同样的,针对大象这个对象也可以作些文章。这只大象或许只是刚出生的呢?或许自己喜欢冰箱自己走进去呢?或许是个大象模型呢?...对于冰箱这个对象的设想就不再赘述了,可以根据我的相关思路类推。对象的存在,可以让我们把对问题的处理多样化,可以让我们有更多的选择和自主性,至于我们对这个对象的定义是否合乎逻辑常理,只要遵守python的规则,其他头疼的事还是交给编译器(C语言)(C表示很蛋疼)

  一切皆对象。要学习好python就要有那种一切皆对象的霸气,当你看谁都像是对象的时候(绝对的资深光棍),那么你离python出师也就不远了。python中的一些数据结构其实是一种对象,python中的函数也是一种对象;以往面向过程的思维模式经常会对我们学习python产生误导,在接触面向对象之前谁能想到一个简单的变量也能成为对象呢,就像你能把一片树叶,一滴水甚至是空气当成你的女朋友吗?以下是我在python交互式命令行中执行的两个指令:

 

   从这个显示结果可以看到变量a (在python中称它为标签a会比较形象,这个在后面python的动态特性中会讲) 其实是类int()的一个实例。(类的实例就是对象) 这个结果其实就已经说明了,变量a是一个对象。(type()方法的作用返回数据结构的类型)

   接下来我就介绍一下面向对象、面向过程、机器和程序员这四者间的爱恨情仇。上文中其实已经隐晦的提到了它们四者间的关系。

  在以面向过程的范式编写程序时,程序代码的逻辑要偏向机器的逻辑,换句话说就是——机器和面向过程更亲,他们之间更有共同语言(要深入探寻C和机器之间联系可以去看看汇编,其实汇编的面向过程更加明确直观);说的更现实点就是,机器就是“祖宗”,你(程序员)面向过程的时候要对“祖宗”“察言观色”,把“祖宗”给“伺候”好了,“祖宗”要是不高兴了,那就是“罢工”你也没辙。

  而在以面向对象的范式编写程序时,你(程序员)可以不用去看机器的“脸色”,自由发挥你的能力,你想要怎么"DIY"都可以,当然,你“DIY”的实现要遵循python的既定规则。这就好比商家(程序员)要出售一个产品,有一个代理商(编译器,就是C)会帮你把产品出售给客户;只要你的产品指标是符合与代理商所签订的合同(python的既定规则)的,那么,对于客户的各种“无理”要求你都不用去操心了,自有代理商帮你解决,你只要用心设计生产你所需要的产品就行了。

  面向对象、面向过程、程序员、机器四者间的直接关系如下:

  面向对象编程时:程序员 --> 面向对象(python) --> 面向过程(C)--> 机器

  面向过程编程时:程序员 --> 面向过程(C)-->机器

  面向对象编程(python)比面向过程编程(C)多了一个步骤,很简单的可以理解到,面向对象编程(python)的执行效率肯定是比面向过程编程(C)低,即使面向对象编程(python)能使我们更方便进行头脑风暴,而到底使用面向对象编程还是面向过程编程就看具体的项目和个人习惯了。

  上帝在为你打开一扇门的同时也会帮你关上另一扇门;你想走独木桥到河对岸去就注定离你原岸越来越远。

ps:以上是我对面向对象这一概念的粗浅认识。就面向对象与面向过程这两者间的联系方面,我的一些解释难免有些片面,但对于初学者,应该能比较快的建立起面向对象的概念,如果有什么错漏,一定改正。

 

posted @ 2018-06-10 02:00  3fman  阅读(174)  评论(0编辑  收藏  举报