如何透过现象看本质,真正理解“类”这个概念?

2020-10-15 14:51:51 +08:00
 Hlianbobo
最近看 python 的书,其中讲了一些关于面向对象和类的知识。我看了以后头脑当中产生很多困惑,在此写出来。还请各位老师点播。

我看后感觉类就是一个自定义函数包。例如自己定义一个函数包的名称叫 A,包里面包含了好几个方法(也就是函数) sin,cos,子类 B 里面包含了方法(函数) tan 。tan 的定义使用了类 A 中的方法 sin 和 cos 。tan=A.sin/A.cos

如果这就是类。那么我们直接定义几个全局变量 sin,cos,tan 。以后直接在程序中调用不就可以了?何必非要打包到 A 和 B 里面。以后再通过 A.sin A.cos 的方式调用呢?没有本质区别啊。看起来只是形式上不同。

不过反过来一想,我上面的理解肯定有有问题的。如果类仅仅是个自定义函数包。那么就不存在某语言是否支持类或某语言不支持类的问题了。喜欢使用类的程序员。直接自己定义一个全局变量叫做 A 。然后把 A 接收的参数传给内部的函数 sin 和 cos,不一样可以实现“类”的调用??哪有这种事。如果时这样 python 哪还有必要规定专门用 class 来定义类,用 def 来定义一个方法?
所以究竟什么是类。使用类相对于使用全局变量有什么区别?有什么优势?还请老师点播。
6771 次点击
所在节点    Python
76 条回复
sudoy
2020-10-16 10:33:11 +08:00
可能更多是为了方便重复利用吧,比如特别是可拓展性和可维护性更高。我刚学的时候不大习惯用类,后面看到别人都用就慢慢开始适应了
oNuGrInDiNg
2020-10-16 10:42:28 +08:00
就是根据工程实践中的经验,总结出来的可复用的一些设计模式。
laqow
2020-10-16 10:52:12 +08:00
写写别的语言,写点 R 感受全是全局变量的世界,写点 javascript 感受全是闭包和对象的世界
namelosw
2020-10-16 11:22:35 +08:00
@someonedeng 面向对象这个词是 Alan Kay coin 的. 但是他指的是消息传递的那面向对象,跟封装继承多态没关系. 后多年面向对象火了之后就大家一直 cue 他说他发明了面向对象,他就很郁闷:我 TM 说的面向对象根本就不是这些渣渣...

我记得 OOPSLA 97 年有个 Alan Kay 的 talk 里面提到了,可以在 Youtube 搜到.
q447643445
2020-10-16 11:51:03 +08:00
类不类 方法不方法的 都是在模拟现实世界.. java 编程思想里面写的很清楚了
julyclyde
2020-10-16 11:55:23 +08:00
这个理解基本是正确的
古代的 C++就是用 struct 来做 class 的
1024com
2020-10-16 12:19:29 +08:00
类是大自然的进化法则🧬,用到了编码中而已。
exploreXin
2020-10-16 12:22:29 +08:00
上网搜"范畴论",哲学里面的一个分支,这是面向对象的底层理论基础。
way2explore2
2020-10-16 12:41:07 +08:00
@hello2060 这歌例子也是一个开闭原则的实现
way2explore2
2020-10-16 12:42:11 +08:00
好了,看了这么多,请把上边别人说的都忘掉。

跟我念,

everything is an object, this is OOP.
tairan2006
2020-10-16 12:50:19 +08:00
楼主你 OOP 基础都没有瞎想啥=_=

楼上还有人说 python 没多态的,简直醉了
wangkun025
2020-10-16 12:54:27 +08:00
看完我竟然不知道怎么回答。
ydpro
2020-10-16 13:33:22 +08:00
类是抽象,抽象出通用的,将可变的暴露出来。实现最少的,最低耦合的代码来写出复杂的功能。
lovecy
2020-10-16 15:39:01 +08:00
学不懂类这个概念,面向对象还可以,类就算了,理解不了,可能 JS 写多了吧。
walpurgis
2020-10-17 01:17:18 +08:00
类就是变量类型,定义类的本质就是定义变量类型,初学是我就这么理解的,别被复杂概念绕晕
比如 py 里 s = 'abc',然后输入 type(s),就能知道 <class 'str'>,s 是 str 类型,str 是 py 内建的类
现在我想得到 'abc' 的大写,只要调用 s.upper()就可以,很方便
因为事先知道了 s 是 str 类型,函数 upper 就是 str 类的方法,只有 str 类型的变量才能调用 upper,相当于 str 类型的变量自带操作自己的函数
主楼里提到 A.sin A.cos 没意义是对的,因为你的 A 里面没有存储变量,sin cos 都纯函数,没有必要成为方法,一个有意义的方法一定是跟自身所存储的数据有关系
retamia
2020-11-10 17:28:20 +08:00
@Hlianbobo SICP 也有 Python 版本的,可以去看下。 数据挖掘这块不了解,没做过。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/715238

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX