网站首页 > 技术文章 正文
转载:
作者:猫叔玩流量 来源:博客园
这段时间一直都在学习python,主要目的还是打算学习一门互联网的编程语言,为后续的职业生涯做一些规划,毕竟java在互联网除了电商领域有叫广泛的使用场景之外,在互联网其他领域还不是很普及,并且java太重量级了。而python在相对来说轻量级并且易于使用,很适合互联网产品快速迭代开发方式。
个人之前接触的唯一一个纯面向对象编程语言就是java,以至于很长一段时间内,我都以为面向对象编程的模型应该都是以java这样为基础的,直到看了javasript和python等以函数式编程为主,支持面向对象编程的语言,才更深的了解面向对象的编程本质。
什么是对象,对于对象的理解,我感觉就是具有某些特性的物质,比如说狗。而面向对象编程最大的特点就是 把 对象的属性和它相关的行为进行封装,比如狗的品种就是狗的属性,但是狗叫就是狗的行为。我们把这两个特性封装到一个具体的对象里面,就构成了面向对象的编程的基础。如果把对象的属性称作数据,对象的行为成为函数,那么数据就构成了对象的状态,同一个对象中的数据可以有很多不同的版本,数据是变化的,函数是不变的,只不过这个函数就是属于这个对象的。
但是对象的行为一定非要和对象绑定吗?是不是可以脱离对象而独立存在了。比如我们说狗叫,那么叫这个动作,一定非要和狗绑定吗,是不是也可以和人绑定的?还有就是比较两个数的大小,这个行为的对象是谁 ? 通过这些思考我们发现,很多时候行为和可以独立对象独立存在的,这些独立存在的行为不属于任何对象,或者我们并不需要关心他属于谁,只需要关注他的目的是什么即可。
以上两个问题在java里面都反映的比较明显,static关键字用来表明这个行为不和任何对象绑定,比如public static void main ,这个main方法就不属于定义它的class所对应的对象。还有java里面的Math类,这个类里面的方法都是public static的,说明这些方法都不属于任何对象。而java是纯面向对象的,只能把这些不属于任何具体对象的定义为static,而其对应的class类,感觉给他定义了一个命名空间而已。
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方法的支持简洁明了的多。
对于面向对象的设计,不同的语言虽然不同,但是其核心思想还是相似的。但是由于编程语言所支持的编程范式不一样,实现方式差别还是比较大的。通过学习多范式编程语言,能够加深对这种编程范式的理解。
- 上一篇: 知识总结-Java8 Stream函数式编程
- 下一篇: 3.1 Python高级编程-函数式编程工具
猜你喜欢
- 2024-11-16 3.1 Python高级编程-函数式编程工具
- 2024-11-16 知识总结-Java8 Stream函数式编程
- 2024-11-16 bind、call、apply 区别?如何实现一个bind?
- 2024-11-16 Javascript基础重拾笔记之手写apply、call
- 2024-11-16 java 8新特性 常用内置函数式接口
- 2024-11-16 7、JavaScript 内置的常用对象有哪些?该对象常用的方法(必会)
- 2024-11-16 Java中“::”是什么含义(java中+是什么)
- 2024-11-16 Java 8 中的 Function:让代码从繁琐到简洁的魔法工具
- 2024-11-16 13万字详细分析JDK中Stream的实现原理(中)
- 2024-11-16 面试官问到.call()和.apply()怎么办?JavaScript高级技巧揭秘
- 标签列表
-
- content-disposition (47)
- nth-child (56)
- math.pow (44)
- 原型和原型链 (63)
- canvas mdn (36)
- css @media (49)
- promise mdn (39)
- readasdataurl (52)
- if-modified-since (49)
- css ::after (50)
- border-image-slice (40)
- flex mdn (37)
- .join (41)
- function.apply (60)
- input type number (64)
- weakmap (62)
- js arguments (45)
- js delete方法 (61)
- blob type (44)
- math.max.apply (51)
- js (44)
- firefox 3 (47)
- cssbox-sizing (52)
- js删除 (49)
- js for continue (56)
- 最新留言
-