Ruby如何比Python更面向对象?

pde*_*ger 22 ruby python oop

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

nik*_*kow 21

如果从1993年开始使用Python并将其与Ruby进行比较,则后者更加面向对象.但是,在Python 2.2中进行大修之后,这已不再适用.我会说现代Python就像面向对象一样.

  • +1.这是非常重要的.Matz于1993年2月23日宣布Ruby.他对现有语言的调查使他开始研究Ruby,甚至在此之前就已经出人意料了.因此,您必须考虑历史上下文,您不能只与Python 3.2进行比较,您需要查看1992/93中广泛可用的版本.此外,您必须考虑"文化"背景:matz非常熟悉Smalltalk.任何使用过Smalltalk的人通常对OO的看法都比没有使用过的人强得多.例如Alan Kay说所有州都必须是私人的. (12认同)

Eli*_*sky 15

通常给出的一个例子是len,Python中的内置函数.您可以__len__在对象中实现一个特殊方法,该方法将被调用len,但len仍然是一个函数.在Ruby中,对象只有.length属性/方法,所以当你说obj.length而不是len(obj)虽然深入到底层时,它看起来更像面向对象.

也就是说,多年来Python已经朝着更加面向对象的方向发展.目前,所有对象(以及隐式的用户定义对象)都继承自object该类.还添加了元类,并且在ABCs(抽象基类)的帮助下,许多内置和核心库类已被组织成层次结构.

在我大量使用Python的过程中,我从来没有发现它在OO部门中缺乏.它可以做我想要它与对象做的一切.诚然,Ruby 感觉更纯粹是OO,但至少根据我的经验,这并不是一个真正的实际问题.

  • @nikow:关键是`len`是一个实际的函数.运算符重载只是语法糖 - 编译器实际上生成了一个方法调用.Python的`len`不是这种情况 (4认同)
  • @nikow:我仍然坚持认为它略有不同.如果你反汇编一些使用`len`的Python代码,你会看到一个函数的*实际调用*.没错,这个函数会找到`__len__`(顺便说一下,在几个级别的间接之后). (4认同)
  • 我发现'len'的例子具有误导性.在这种意义上,运算符重载也不是面向对象的,因为`a + b`看起来不像方法调用.重要的是它作为一种方法实现. (3认同)

Anu*_*rag 10

来自WikiVS,

...在Ruby中所有函数和大多数运算符实际上是对象的方法,许多Python函数是过程函数而不是方法.

下面采访 Ruby的创建者Matz,为您的问题和上述观点提供了额外的背景.

...

斯图尔特:让我们从一点历史开始吧.你为什么决定写Ruby?

Matz:早在1993年,我就和一位同事谈论脚本语言.他们的力量和可能性让我印象深刻.我觉得脚本是要走的路.

作为一个长期面向对象的编程爱好者,在我看来,OO编程也非常适合编写脚本.然后我环顾网络.我发现尚未发布的Perl 5将实现OO功能,但它并不是我想要的.我放弃了Perl作为面向对象的脚本语言.

然后我遇到了Python.它是一种解释性的,面向对象的语言.但我不觉得它是一种"脚本"语言.此外,它是程序编程和面向对象编程的混合语言.

我想要一种比Perl更强大的脚本语言,并且比Python更面向对象.这就是为什么我决定设计自己的语言.

...