我记得有一点,it was said that Python is less object oriented than Ruby,因为在Ruby中,一切都是对象。 Python也改变了吗?最新的Python是否比以前的版本更面向对象?
答案 0 :(得分:40)
Jian Lin - 答案是“是”,Python比Matz决定创建Ruby更加面向对象,而现在这两种语言都以“一切都是对象”为特色。当Python更年轻时,“类型”(如字符串和数字)缺少方法,而“对象”是使用“类”语句(或故意在C扩展模块中构建类)构建的,并且效率稍低但是支持方法和继承。在20世纪90年代早期,当快速386是一台相当不错的机器时,这种妥协是有道理的。但是类型和类在Python 2.2(2001年发布)中统一,字符串有方法,在更新的Python版本中,用户甚至可以从它们中继承。
所以:Python当然不那么面向对象;但是,据我所知,现在每一个旧的障碍都消失了。
以下是发生统一的指南:
http://www.python.org/download/releases/2.2/descrintro/
澄清:或许我可以更简单地说:在Python中,一切都总是是一个对象;但是一些基本类型的对象(整数,字符串)曾经被“不同的规则”所阻止,这些规则阻止了OO编程方法(如继承)与它们一起使用。现在已经修复了。另一个响应中描述的len()方法可能是我希望Guido在升级到Python 3.0时改变的唯一方法。但至少他给了我字典理解,所以我不会抱怨太大声。 : - )
答案 1 :(得分:12)
我不确定我是否认为Ruby比Python更面向对象。面向对象不仅仅是使用对象和点语法。我看到的一个常见论点是,在Python中获取列表的长度,你可以这样做:
len(some_list)
我认为这是bikeshed argument。这真正转化为(几乎直接)的是:
some_list.__len__()
完全面向对象。我认为Rubyists可能会有点困惑,因为通常面向对象涉及使用点语法(例如object.method()
)。但是,如果我误解了Rubyists的论点,请随时告诉我。
无论面向对象如何,以这种方式使用len都有一个优点。对于某些语言而言,总是让我烦恼的一件事是必须记住是否对特定对象使用some_list.size()
或some_list.length()
或some_list.len
。 Python的方式意味着只需记住一个函数
答案 2 :(得分:7)
虽然这不是一个恰当的答案......为什么你关心Python或多或少的OO? Python的酷炫之处在于它是 pythonic ,而不是面向对象或功能,或者是目前流行的范例! : - )
我学会了使用Java和面向对象编程,但是现在我没有对它进行说明,因为我知道OOP不是所有问题的解决方案(事实上,没有单一的范例)。
请参阅:
答案 3 :(得分:2)
坚持下去,Ruby和Python都是面向对象的。对象是对象。没有更多面向对象的“比较功能”会引导您找到更好的比较功能。 语法不仅使某些语言看起来像面向对象,还有数据模型。
对象是Python的数据抽象。 Python程序中的所有数据都由对象或对象之间的关系表示。 (从某种意义上说,并且与Von Neumann的“存储程序计算机”模型一致,代码也由对象表示。)http://docs.python.org/reference/datamodel.html
答案 4 :(得分:2)
这是一种不正确的信念。
请在此处查看我之前的答案,以获得更深入的解释:
Is everything an object in python like ruby?
为什么不直接从列表中公开.len()呢?我认为你不能完全将OO设计与语法分开,因为语法在很大程度上定义了你的代码范例。 some_list.len()是OO,因为您将列表视为一个对象,可以告诉您它的长度是多少。 LEN(some_list)
.len()可以在列表中直接使用。它以__len __()的形式提供。 len()是一个函数对象。您可以使用dir(len)查看其所有方法。虽然我不知道为什么Guido决定让__len __()方法更长,但它并没有改变所有这些仍然是对象的事实。
答案 5 :(得分:1)
我有相同的“感知”可能源于此:
Why was python created in the first place:
在我看来,一个像ABC [...]这样的语法的脚本语言将满足需要
An Interview with the Creator of Ruby:
“我想要一种比Perl更强大的脚本语言,并且比Python更面向对象
我知道这种看法与现实并不相同。 Python和Ruby都是很棒的编程语言,而且都非常好用。