发明Ruby的Matz说,他设计这种语言要比Python更加面向对象。那么,Ruby如何比Python更加面向对象呢?
如果你拿1993年的Python和Ruby进行比较,那么后者更加面向对象。然而,在Python 2.2的彻底改革之后,这种说法不再正确。我认为现代Python是最面向对象的。
一个常见的例子是Python中的内置函数len
。您可以在您的对象中实现一个特殊的__len__
方法,这个方法将被len
调用,但len
本身还是一个函数。而在Ruby中,对象只有.length
属性/方法,所以当你使用obj.length
时,它看起来更像是面向对象编程,而不是len(obj)
,尽管在底层基本相同。
然而,多年来Python已经朝着更加面向对象的方向发展。目前所有对象(包括用户定义的对象)都继承自object
类。元类也已经被添加进来了,并且许多内置和核心库类已经通过抽象基类(ABCs)组织成了层次结构。
在我对Python的大量使用中,我从未觉得其面向对象功能有所不足。它能够做到我想要的一切对象操作。诚然,Ruby在感觉上更加纯粹的面向对象,但至少在我的经验中,这并不是一个真正的实际问题。
a+b
看起来并不像一个方法调用。重要的是它被实现为一个方法。 - nikowlen
是一个实际函数。操作符重载只是语法糖-编译器实际上生成了一个方法调用。这在Python的len
中并不适用。 - Eli Benderskylen
通常会调用 __len__
方法。将 len
作为函数是一种语法糖,就像运算符重载一样。 - nikowlen
的Python代码,你会看到一个实际的调用函数。当然,这个函数会找到__len__
(顺便说一下,经过几层间接寻址)。 - Eli Bendersky从WikiVS中得知,在 Ruby 语言中,所有函数和大多数运算符实际上都是对象的方法。而在 Python 中,有一些函数是过程式函数,不是方法。
这篇采访是与 Ruby 创始人 Matz 的对话,提供了更多关于您问题和上述��点的背景信息。
…
Stewart:我们从一点历史开始。你为什么决定写 Ruby 呢?
Matz:1993年,我与同事谈论脚本语言时,我对它们的强大和可能性印象深刻。我认为脚本是前进的方向。
作为长期的面向对象编程迷,我觉得面向对象编程非常适合脚本。然后,我四处寻找。我发现 Perl 5(尚未发布)将要实现 OO 特性,但并不是我想要的东西。我放弃了 Perl 作为面向对象脚本语言。
然后我遇到了 Python。它是一种解释型的面向对象语言。但我觉得它不是一个“脚本”语言。此外,它是一种混合式的过程式编程和面向对象编程语言。
我想要比 Perl 更强大、比 Python 更面向对象的���本语言。这就是我决定设计自己的语言的原因。
…
len
或<
这样的函数,它们被实现为方法(分别为__len__
和__lt__
)。 - Humphrey Bogart很简单,Ruby中的几乎所有内容(包括数字)都是对象;没有标量值。