Ruby 如何比 Python 更面向对象?
Posted
技术标签:
【中文标题】Ruby 如何比 Python 更面向对象?【英文标题】:How is Ruby more object-oriented than Python? 【发布时间】:2011-04-09 14:27:33 【问题描述】:发明 Ruby 的 Matz 说,他设计的语言比 Python 更面向对象。
【问题讨论】:
【参考方案1】:如果您将 1993 年的 Python 与 Ruby 进行比较,那么后者更加面向对象。然而,在overhaul in Python 2.2 之后,这不再是真的。我想说的是现代 Python 是面向对象的。
【讨论】:
+1。这个非常重要。 Matz 于 1993 年 2 月 23 日宣布了 Ruby。他对导致他开始研究 Ruby 的现有语言的调查显然是在此之前。因此,您必须考虑历史背景,不能只与 Python 3.2 进行比较,您需要查看 1992/93 年广泛可用的版本。此外,您必须考虑“文化”背景:matz 非常熟悉 Smalltalk。任何曾经使用过 Smalltalk 的人通常对 OO 的看法都比没有使用过的人要强烈得多。例如。 Alan Kay 说所有状态都必须是私有的。【参考方案2】:一个常见的例子是len
,它在 Python 中是一个内置函数。您可以在您的对象中实现一个特殊的__len__
方法,该方法将由len
调用,但len
仍然是一个函数。在 Ruby 中,对象只有 .length
属性/方法,所以当你说 obj.length
而不是 len(obj)
时,它看起来更面向对象,尽管在底层发生了几乎相同的事情。
也就是说,多年来 Python 已经朝着更加面向对象的方向发展。目前所有对象(以及隐式用户定义的对象)都继承自 object
类。还添加了元类,许多内置和核心库类在 ABC(抽象基类)的帮助下被组织成层次结构。
在我大量使用 Python 的过程中,我从未发现 OO 部门缺少它。它可以做我想让它对对象做的所有事情。诚然,Ruby感觉更纯粹一些 OO,但至少根据我的经验,这并不是一个真正实际的问题。
【讨论】:
我发现“len”示例具有误导性。从这个意义上说,运算符重载也不是面向对象的,因为a + b
看起来不像是方法调用。重要的是它被实现为一种方法。
@nikow:关键是len
是一个实际的函数。运算符重载只是语法糖——编译器实际上生成了一个方法调用。 Python 的len
并非如此
正如你自己写的len
一般调用__len__
方法。将len
作为函数是语法糖,就像运算符重载一样。
@nikow:我仍然坚持认为它略有不同。如果您反汇编一些使用 len
的 Python 代码,您将看到对函数的实际调用。没错,这个函数会找到__len__
(顺便说一下,经过几级间接)。【参考方案3】:
来自WikiVS,
...在 Ruby 中,所有函数和大多数运算符实际上都是对象的方法,而许多 Python 函数是过程函数而不是方法。
以下interview 与 Ruby 的创建者 Matz 为您的问题和上述观点提供了额外的背景。
…
Stewart:让我们从一点历史开始。您为什么决定编写 Ruby?
Matz:早在 1993 年,我正在和一位同事谈论脚本语言。他们的力量和可能性给我留下了深刻的印象。我觉得脚本是要走的路。
作为一个长期的面向对象编程爱好者,在我看来,OO 编程也非常适合编写脚本。然后我环顾网络。我发现尚未发布的 Perl 5 即将实现 OO 功能,但这并不是我真正想要的。我放弃了 Perl 作为一种面向对象的脚本语言。
然后我遇到了 Python。它是一种解释性的、面向对象的语言。但我不觉得它是一种“脚本”语言。此外,它还是一种过程式编程和面向对象编程的混合语言。
我想要一种脚本语言,它比 Perl 更强大,比 Python 更面向对象。这就是我决定设计自己的语言的原因。
…
【讨论】:
许多 Python 函数是程序化的:我假设这意味着函数,例如len
或 <
;这些被实现为方法(分别为__len__
和__lt__
)。【参考方案4】:
很简单,Ruby 中的几乎所有东西(包括数字)都是一个对象;没有标量值。
【讨论】:
@Beau,AFAIK,在 python 中,你不能将你的函数注入到内置类(整数,字符串)中......所以从这方面来说,Ruby 更 OOP。 @st0le:我认为这不会使 Ruby 更加面向对象。仅仅因为 Ruby 可以重新打开所有类以添加更多方法并不是(恕我直言)OO 的衡量标准。 Java 不能“向类添加方法”。 [不敢相信我曾经以 Java 为榜样!]。能够猴子打补丁/打鸭子更多的是关于活力而不是面向对象。 Ruby 不是更多的 OOP,因为它可以修补类(我同意它更多的是关于动态性),而是因为它从一开始就被设计为纯 OOP 语言;一切都是对象。 现代 Python 也一样,一切都是对象。以上是关于Ruby 如何比 Python 更面向对象?的主要内容,如果未能解决你的问题,请参考以下文章