Python里的所有东西都是对象吗,像Ruby一样?
我在另一个Stack Overflow的问题上看到,有人说Python和Ruby很像,因为它们都有“万物皆对象”的特点,也就是说在Python里,所有东西都是对象,就像在Ruby里一样。
这是真的吗?在Python里,所有东西都是对象吗,就像在Ruby里那样?
在这方面,它们有什么不同,还是说其实是一样的?比如说,你能在Python里像在Ruby那样对数字进行操作吗,比如:
y = 5.plus 6
在Python里也能这样做吗?
8 个回答
说“所有东西”在Python和Ruby里都有点夸张。比如,if
这个词并不是“一个对象”,而是用来开始条件判断的关键字,或者在Python的列表推导式和生成器表达式中使用。人们发现,在C++中并不算对象的函数、类、方法等,在Ruby或Python中却是对象,这让人很兴奋。不过,有些东西在Ruby中是对象,但在Python中不是,反之亦然,比如代码块、正则表达式等等。
在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的库则是通过向某个模块添加全局函数来扩展的。
在Python中,所有东西都是对象,几乎所有对象都有属性和方法。所有的函数都有一个内置的属性
__doc__
,这个属性会返回函数源代码中定义的doc string
。比如,sys
模块就是一个对象,它有一个叫path
的属性,除此之外还有其他属性。就这样。不过,这就引出了一个问题:什么是对象?不同的编程语言对“对象”的定义各不相同。在某些语言中,对象必须有属性和方法;而在其他语言中,对象可以被继承。在Python中,对象的定义比较宽松;有些对象既没有属性也没有方法(这一点在第三章会详细讲),并不是所有对象都可以被继承(这一点在第五章会详细讲)。但从某种意义上说,所有东西都是对象,因为它们可以被赋值给变量,或者作为参数传递给函数(这一点在第四章会详细讲)。
和Python一样,在Ruby中……一切都是对象。
所以,来自Ruby官网的信息是:在Python中,一切都是对象。