这段时间一直都在学习python,主要目的仍是打算学习一门互联网的编程语言,为后续的职业生涯作一些规划,毕竟java在互联网除了电商领域有叫普遍的使用场景以外,在互联网其余领域还不是很普及,而且java过重量级了。而python在相对来讲轻量级而且易于使用,很适合互联网产品快速迭代开发方式。javascript
我的以前接触的惟一一个纯面向对象编程语言就是java,以致于很长一段时间内,我都觉得面向对象编程的模型应该都是以java这样为基础的,直到看了javasript和python等以函数式编程为主,支持面向对象编程的语言,才更深的了解面向对象的编程本质。java
什么是对象,对于对象的理解,我感受就是具备某些特性的物质,好比说狗。而面向对象编程最大的特色就是 把 对象的属性和它相关的行为进行封装,好比狗的品种就是狗的属性,可是狗叫就是狗的行为。咱们把这两个特性封装到一个具体的对象里面,就构成了面向对象的编程的基础。若是把对象的属性称做数据,对象的行为成为函数,那么数据就构成了对象的状态,同一个对象中的数据能够有不少不一样的版本,数据是变化的,函数是不变的,只不过这个函数就是属于这个对象的。python
可是对象的行为必定非要和对象绑定吗?是否是能够脱离对象而独立存在了。好比咱们说狗叫,那么叫这个动做,必定非要和狗绑定吗,是否是也能够和人绑定的?还有就是比较两个数的大小,这个行为的对象是谁 ? 经过这些思考咱们发现,不少时候行为和能够独立对象独立存在的,这些独立存在的行为不属于任何对象,或者咱们并不须要关心他属于谁,只须要关注他的目的是什么便可。编程
以上两个问题在java里面都反映的比较明显,static关键字用来代表这个行为不和任何对象绑定,好比public static void main ,这个main方法就不属于定义它的class所对应的对象。还有java里面的Math类,这个类里面的方法都是public static的,说明这些方法都不属于任何对象。而java是纯面向对象的,只能把这些不属于任何具体对象的定义为static,而其对应的class类,感受给他定义了一个命名空间而已。app
python中的面向对象的设计感受比java要复杂,可是经过和java面向对象的设计相比,可以让你更深刻的了解面向对象编程的核心。python中 class若是定义对对象的行为,第一个参数好比为self。当初本身对这个设计理解很不理解,为何弄的这么复杂,后来想一想面向对象思想是什么,忽然就明白了,这个self就是数据,方法就是行为,这个行为要和某个对象绑定,只不过java里面帮助咱们省去了这个过程,经过建立对象的语法new XXXClass 自动进行绑定。java是静态的,一旦方法和数据进行绑定,这个绑定关系就不会发生改变,可是python绑定关系就能够进行改变。若是方法参数中没有self,那么这个方法就和java里面的static方法相似,表示这个方法属于某一个类,不属于某个对象。编程语言
而javascript面向对象设计就是更有意思了,构造函数自己就是一个function,经过function.apply方法和具体的对象进行绑定,在javascript中用this来表示function所绑定的对象。函数式编程
而在scala中,对象的方法和class 对应的static方法就彻底分开了。更确切的说,class对应的static方法,就不属于这个class,因此scala定义了object 这个概念。全部class中定义的方法都属于对象的行为,而以前java中全部class static方法,都属于object。二者在语法上都已经明确区分了。我的感受这个明显比java,python,javascript 对static方法的支持简洁明了的多。函数
对于面向对象的设计,不一样的语言虽然不一样,可是其核心思想仍是类似的。可是因为编程语言所支持的编程范式不同,实现方式差异仍是比较大的。经过学习多范式编程语言,可以加深对这种编程范式的理解。学习