Python里的所有东西都是对象吗,像Ruby一样?

75 投票
8 回答
38848 浏览
提问于 2025-04-15 11:36

我在另一个Stack Overflow的问题上看到,有人说Python和Ruby很像,因为它们都有“万物皆对象”的特点,也就是说在Python里,所有东西都是对象,就像在Ruby里一样。

这是真的吗?在Python里,所有东西都是对象吗,就像在Ruby里那样?

在这方面,它们有什么不同,还是说其实是一样的?比如说,你能在Python里像在Ruby那样对数字进行操作吗,比如:

y = 5.plus 6

在Python里也能这样做吗?

8 个回答

26

说“所有东西”在Python和Ruby里都有点夸张。比如,if 这个词并不是“一个对象”,而是用来开始条件判断的关键字,或者在Python的列表推导式和生成器表达式中使用。人们发现,在C++中并不算对象的函数、类、方法等,在Ruby或Python中却是对象,这让人很兴奋。不过,有些东西在Ruby中是对象,但在Python中不是,反之亦然,比如代码块、正则表达式等等。

45

在Python中,所有东西都是对象,但它和Ruby在处理名字和与对象互动的方式上有所不同。

举个例子,Ruby在它的基本对象类中提供了一个叫做'to_s'的方法来把对象转换成字符串,而Python则把这个功能直接集成在字符串类型里。也就是说,你是通过构造一个字符串来把其他类型转换成字符串。比如说,在Ruby中你会写5.to_s,而在Python中你会写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的库则是通过向某个模块添加全局函数来扩展的。

98

DiveIntoPython - 一切都是对象

在Python中,所有东西都是对象,几乎所有对象都有属性和方法。所有的函数都有一个内置的属性 __doc__,这个属性会返回函数源代码中定义的 doc string。比如,sys模块就是一个对象,它有一个叫 path 的属性,除此之外还有其他属性。就这样。

不过,这就引出了一个问题:什么是对象?不同的编程语言对“对象”的定义各不相同。在某些语言中,对象必须有属性和方法;而在其他语言中,对象可以被继承。在Python中,对象的定义比较宽松;有些对象既没有属性也没有方法(这一点在第三章会详细讲),并不是所有对象都可以被继承(这一点在第五章会详细讲)。但从某种意义上说,所有东西都是对象,因为它们可以被赋值给变量,或者作为参数传递给函数(这一点在第四章会详细讲)。

Ruby Docs - 从Python到Ruby

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

所以,来自Ruby官网的信息是:在Python中,一切都是对象。

撰写回答