Blog Home
Updated: 2023 Oct 09

类和函数有什么区别

昨晚失眠,闲来无事,看了会书,还睡不着,又起来刷了会论坛,看到这么一个提问。

不懂就问。类和函数有什么区别?

看了 python 的书籍,里面涉及到类的部分(也许是写的不好,也许是我理解不够。)。让我觉得类和函数没区别啊。写好一个类以后。你给他输入。他给你返回输出。写好了放在那里。随时调用。类可以嵌套。父类,子类。函数也可以嵌套。 问过几个朋友,解释的也不太清楚。不知道这问题是否可以简单的说明白。如果需要很大篇幅。是否有优秀的书、文章、或视频针对以上困惑。如有望推荐。

““只用””python 做数据挖掘,机器学习,会用到面向对象的编程方法么?针对普通程序员的算法书需要学些么?

以下是我的回答:

类( class )是和面向对象( object-oriented )高度相关的。因为 python 是一种面向对象的语言,(当然面向对象的语言有很多,例如 java 和 php 。但概念都是相通的。)所以我们需要了解一下什么是对象?

在面向对象的世界里,人们经常讲「万物皆对象」。这一点也没有假,从实际存在的事物,到抽象概念,万事万物我们都可以把它理解为某种类型的对象。而类是什么?

类是用来描述某种特定类型的对象。它包括方法和实例变量。一个类定义一种对象,同时也可以生产这种对象。所以类既是对象的原型,也是生产对象的工厂。生产出来的这种对象,我们也称它为实例。而函数是什么?

这里先澄清一个概念,函数和方法是不同的,但它们很相似。所以经常有人把他们的概念混用。 简单来讲,函数和方法的区别是,函数属于显式的消息传递,方法则是隐式的消息传递。也可以说方法是类定义中定义的一种特殊函数。好了,说回函数,那函数到底是什么,我的理解,函数是对象的具体实现方法。通常对象的状态定义在变量字段里,行为是通过方法来表达。方法通过改变对象的状态实现对象转变或者生产吧。所以我们也可以说,面向对象( OOP )本质是基于状态的,方法可以通过对状态的维护或者改变,来完整的表达某个类型的对象。你也可以搜索类似「 what's the difference between function and method 」或者「 function vs. method 」。

好了,现在来回答问题。首先你有这样的疑问很正常,因为 python 和 php 在实现上不是基于类的或者说执行不需要类的定义,它们是独立开来的,它们可以直接使用函数而无需类的定义,而 Java 则是基于类的,它们是一起的不可分割的 。我猜测可能是因为可能是实现方式或者是因为编译(解释)方式不同吧。python 和 php 属于解释型语言,而 java 属于编译型语言吧。如果你做大型项目,并且是面向对象编程的,那么因为你定义状态或生产各种对象,并且它们之间又各种相互关联,那么你需要用到类来区分它们,否则会乱成一锅粥的。老话说的好,物以类( class )聚嘛。

你也可以搜索类似「 what is the difference between class and function 」或者「 class vs. function 」。


如果您发现有任何错误或不清楚的措辞,请让我知道。任何更正将感激不禁。
Please let me know if you find any errors or unclear wording. Any corrections will be most appreciated.

早起醒来和朋友聊起这个问题,有些概念更清晰了,可能仍有问题,就待后续再有更深入的见解了。朋友指出这句话是有问题的

我猜测可能是因为可能是实现方式或者是因为编译(解释)方式不同吧。python 和 php 属于解释型语言,而 java 属于编译型语言吧 【这句话不对, 可以删除】

我解释了下

我知道确实是和编译方式关系不大,但是感觉有这方面原因。python和php其实也是可以编译成字节码的。java也不一定就非得编译,应该也可以用解释器执行。

所以我觉得最可能的就是java的面向对象设计的彻底或者更纯粹,之所以没有分开也是想更明确表明这一观点。

另外,他回复的一点补充,我觉得可以参考下。

你回到的很好, 你可以补充一句, 面向函数–>面向对象 是一种颗粒度的变大,是编程语言历史的进展,例如1: php 、python 早期版本是面向函数的实现,随着语言的发展,php 、python逐渐加入面向对象的功能,使用class 包含方法 (函数),同时以前的函数也可以独立运行,例如2:Java是面向对象的, 随着java 的发展,逐步加入面向函数编程功能, 他们都是互相借鉴和吸收。

脚本语言一般都是解释执行, 放在已经成型的项目中作为扩展功能使用例如 unix 和shell 就是最好的例子, 而且一个函数可以直接执行,方便使用,如果涉及成面向对象使用起来就比较麻烦, 例如打印 Hello world , Python print ("Hello world") 就搞定了, 面向对象可以好3-5代码才能实现。

就是可能拆开更灵活,而java不想这么做,java对oop实现的比较纯粹,也是想这一概念能够深入人心。另一方面也体现了代码封装的思想和重要性。

Comments:

Email questions, comments, and corrections to hi@smartisan.dev.

Submissions may appear publicly on this website, unless requested otherwise in your email.