Ruby比Python更加面向对象吗?

23

发明Ruby的Matz说,他设计这种语言要比Python更加面向对象。那么,Ruby如何比Python更加面向对象呢?

4个回答

23

如果你拿1993年的Python和Ruby进行比较,那么后者更加面向对象。然而,在Python 2.2的彻底改革之后,这种说法不再正确。我认为现代Python是最面向对象的。


13
这非常重要。Matz 在 1993 年 2 月 23 日宣布了 Ruby。他在开始开发 Ruby 前对现有语言的调查显然会更早一些。因此,您必须考虑历史背景,不能仅与 Python 3.2 进行比较,需要查看 1992/93 年时广泛使用的版本。此外,您还必须考虑“文化”背景:Matz 对 Smalltalk 非常熟悉。任何曾经使用过 Smalltalk 的人通常对面向对象有比没有使用过的人更强烈的看法。例如,Alan Kay 表示所有状态都必须是私有的。 - Jörg W Mittag

18

一个常见的例子是Python中的内置函数len。您可以在您的对象中实现一个特殊的__len__方法,这个方法将被len调用,但len本身还是一个函数。而在Ruby中,对象只有.length属性/方法,所以当你使用obj.length时,它看起来更像是面向对象编程,而不是len(obj),尽管在底层基本相同。

然而,多年来Python已经朝着更加面向对象的方向发展。目前所有对象(包括用户定义的对象)都继承自object类。元类也已经被添加进来了,并且许多内置和核心库类已经通过抽象基类(ABCs)组织成了层次结构。

在我对Python的大量使用中,我从未觉得其面向对象功能有所不足。它能够做到我想要的一切对象操作。诚然,Ruby在感觉上更加纯粹的面向对象,但至少在我的经验中,这并不是一个真正的实际问题。


3
我发现“len”示例具有误导性。从这个意义上说,运算符重载也不是面向对象的,因为a+b看起来并不像一个方法调用。重要的是它被实现为一个方法。 - nikow
5
重点是len是一个实际函数。操作符重载只是语法糖-编译器实际上生成了一个方法调用。这在Python的len中并不适用。 - Eli Bendersky
1
正如你自己所写的,len 通常会调用 __len__ 方法。将 len 作为函数是一种语法糖,就像运算符重载一样。 - nikow
5
@nikow:我仍然坚持认为它有微妙的不同。如果你拆开一些使用len的Python代码,你会看到一个实际的调用函数。当然,这个函数会找到__len__(顺便说一下,经过几层间接寻址)。 - Eli Bendersky

12

WikiVS中得知,在 Ruby 语言中,所有函数和大多数运算符实际上都是对象的方法。而在 Python 中,有一些函数是过程式函数,不是方法。

这篇采访是与 Ruby 创始人 Matz 的对话,提供了更多关于您问题和上述��点的背景信息。

Stewart:我们从一点历史开始。你为什么决定写 Ruby 呢?

Matz:1993年,我与同事谈论脚本语言时,我对它们的强大和可能性印象深刻。我认为脚本是前进的方向。

作为长期的面向对象编程迷,我觉得面向对象编程非常适合脚本。然后,我四处寻找。我发现 Perl 5(尚未发布)将要实现 OO 特性,但并不是我想要的东西。我放弃了 Perl 作为面向对象脚本语言。

然后我遇到了 Python。它是一种解释型的面向对象语言。但我觉得它不是一个“脚本”语言。此外,它是一种混合式的过程式编程和面向对象编程语言。

我想要比 Perl 更强大、比 Python 更面向对象的���本语言。这就是我决定设计自己的语言的原因。


1
一些Python函数是过程式的:我认为这意味着像len<这样的函数,它们被实现为方法(分别为__len____lt__)。 - Humphrey Bogart

-2

很简单,Ruby中的几乎所有内容(包括数字)都是对象;没有标量值。


3
据我所知,在Python中,你无法将自定义函数注入到内置类(Integer、String)中,因此从这个意义上讲,Ruby更符合面向对象编程的原则。 - st0le
6
我不认为这会让 Ruby 变得更加面向对象。仅仅因为 Ruby 可以重新打开所有类并添加更多方法,并不是衡量面向对象特性的标准(在我看来)。Java 无法“向类中添加方法”。(难以置信我曾经将 Java 作为范例!)能够进行 Monkey-Patch/Duck-Punch 更多的是关于动态性而非面向对象特性。 - Matthew Schinckel
1
Ruby不是更OOP,因为它可以猴子补丁类(我同意它更多的是关于动态性),而是因为它从一开始就被设计成纯OOP语言;一切都是对象。 - ab217
2
对于现代Python而言,一切皆为对象。 - nikow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接