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

新手上路,请多包涵

我读到另一个 Stack Overflow 问题,Python 就像 Ruby,因为它涉及“一切皆对象”,而 Python 中的一切都是对象,就像 Ruby 一样。

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

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

 y = 5.plus 6

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

原文由 johnny 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 626
2 个回答

DiveIntoPython——万物皆对象

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

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

Ruby 文档 - 从 Python 到 Ruby

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

所以你可以从 Ruby 自己的网站上找到它:在 Python 中,一切都是对象。

原文由 Unknown 发布,翻译遵循 CC BY-SA 4.0 许可协议

虽然在 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 ,而 Python 库倾向于通过向给定模块添加全局函数来增长。

原文由 Katelyn Gadd 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题