68

我在另一个 Stack Overflow 问题上读到 Python 就像 Ruby,因为它与“一切都是对象”有关,而 Python 中的一切都是对象,就像 Ruby 一样。

这是真的?Python 中的一切都像 Ruby 一样是对象吗?

两者在这方面有何不同,还是真的相同?例如,你能拿一个数字做我见过的 Ruby 的东西吗:

y = 5.plus 6

可以在 Python 中以同样的方式完成吗?

4

7 回答 7

92

DiveIntoPython - 一切都是对象

Python 中的一切都是对象,几乎所有东西都有属性和方法。所有函数都有一个内置属性__doc__,它返回doc string函数源代码中定义的值。sys模块是一个对象,它具有(除其他外)一个名为path. 等等。

不过,这引出了一个问题。什么是对象?不同的编程语言以不同的方式定义“对象”。在某些情况下,这意味着所有对象都必须具有属性和方法;在其他情况下,这意味着所有对象都是可子类化的。在 Python 中,定义比较宽松;有些对象既没有属性也没有方法(第 3 章会详细介绍),而且并非所有对象都是可子类化的(第 5 章会详细介绍)。但从某种意义上说,一切都是对象,它可以分配给变量或作为参数传递给函数(第 4 章会详细介绍)。

Ruby Docs - 从 Python 到 Ruby

与 Python 一样,在 Ruby 中,... 一切都是对象

因此,您可以从 Ruby 自己的网站获得它:在 Python 中,一切都是对象。

于 2009-05-14T21:40:38.337 回答
44

虽然在 Python 中一切都是对象,但它在解析名称和与对象交互的方法上与 Ruby 不同。

例如,虽然 Ruby 在 Object 基类上为您提供了一个“to_s”方法,但为了公开该功能,Python 将它集成到字符串类型本身中——您可以通过从它构造字符串来将类型转换为字符串。而不是5.to_s,你有str(5)

不过,不要被愚弄。幕后仍然有一种方法 - 这就是这段代码有效的原因:

(5).__str__()

所以在实践中,两者本质上是相似的,但你使用它们的方式不同。Python 中的列表和元组等序列的长度是这一原则的另一个例子 - 实际功能建立在具有特殊名称的方法之上,但通过更简单、更易于使用的接口(len函数)公开。

因此,与您在问题中所写内容等效的 Python 将是:

(5).__add__(6)

另一个重要的区别是全局函数的实现方式。在 Python 中,全局变量由字典表示(本地变量也是如此)。这意味着以下内容:

foo(5)

相当于 Python 中的这个:

globals()["foo"].__call__(5)

虽然 Ruby 有效地做到了这一点:

Object.foo(5)

这对用两种语言编写代码时使用的方法有很大影响。Ruby 库倾向于通过向现有类型(如Object.

于 2009-05-14T22:03:28.673 回答
25

“一切”对于 Python 和 Ruby 来说都有点过高——例如,if它不是“对象”,而是用于启动条件语句或(在 Python 中)在列表推导和生成器表达式中的关键字。发现函数、类、方法和所有类似的东西在(比如)C++ 中不是真正的对象,在 Ruby 或 Python 中是对象的热情,引起了这种热情。其他东西可能是 Ruby 中的对象,但不是 Python 或反之亦然(代码块、正则表达式……)。

于 2009-05-14T22:02:51.247 回答
23

在回答您的第二个问题时,是的:

>>> (1).__add__(2)
3
于 2009-05-14T21:51:48.870 回答
2

是的,据我所知,一切都是 Python 中的对象。当然,原始类型和内置类型(int、long、str、float 等)可以被子类化——实际上这些类型本身就是对象。函数是对象,类是对象,甚至代码块在某种意义上也是对象......我想不出Python中有什么不能被视为对象的东西。

于 2009-05-14T21:40:59.507 回答
1

为其他人的优秀答案添加评论:一切都是对象,但有些——特别是字符串和数字类型——是不可变的。这意味着这些类型在赋值、参数传递等方面的行为方式与它们在 C 或 Java(其中整数等不是对象)等语言中的行为方式相同,并且您永远不必担心由传递引起的陷阱-参考。这是一个很好的解决方案:-)

于 2009-05-14T23:08:33.210 回答
0

您好,答案不是一切,参考比这更完整,并提供更多途径,例如在 Python 3.8.5 中,分隔符、运算符和关键字不是对象。stackoverflow.com/a/66374328/11554034

已经在该链接中详细解释了它,请随时查看。

无论如何,下一个说你可以通过说来纠正它(更正确的东西,尽管如果仍然可以更完整,请随意): “逻辑行中的所有内容,不是 NEWLINE,INDENT,DEDENT,空格键字符,运算符,关键字或分隔符是 Python 中的一个对象。”

干杯。

于 2021-02-27T10:37:44.577 回答