【问题标题】:How is Ruby more object-oriented than Python?Ruby 如何比 Python 更面向对象?
【发布时间】:2011-04-09 14:27:33
【问题描述】:

发明 Ruby 的 Matz 说,他设计的语言比 Python 更面向对象。 Ruby 如何比 Python 更面向对象?

【问题讨论】:

    标签: python ruby oop


    【解决方案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 也一样,一切都是对象。
    猜你喜欢
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 2018-06-12
    • 2011-08-09
    • 2010-10-28
    • 2021-06-05
    • 1970-01-01
    相关资源
    最近更新 更多