python中的一切都像ruby一样吗?

另一个堆栈溢出问题的评论指出,Python就像Ruby,因为它涉及到“一切都是一个对象”,Python中的所有东西都是一个对象,就像Ruby一样。

这是真的? python中的一切都像ruby一样吗?

两者在这方面有什么不同?还是他们真的是一样的? 例如,你可以采取一个数字,做我见过的ruby的东西:

y = 5.plus 6 

在Python中可以这样做吗?

DiveIntoPython – 一切都是对象

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

不过,这引发了这个问题。 什么是对象? 不同的编程语言以不同的方式定义“对象”。 在某些情况下,这意味着所有对象都必须具有属性和方法; 在其他情况下,这意味着所有对象都是可以分类的。 在Python中,定义是松散的; 一些对象既没有属性,也没有方法(第3章中的更多内容),并不是所有的对象都是可以被子类化的(第5章的更多内容)。 但是,从某种意义上说,一切都是一个对象,它可以被分配给一个variables,或者作为一个parameter passing给一个函数(更多内容参见第4章)。

Ruby文档 – 从Python到Ruby

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

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

尽pipePython中的所有东西都是对象,但它在解决名称和与对象交互的方法上与Ruby不同。

例如,Ruby为Object基类提供了一个'to_s'方法,为了暴露这个function,Python将它整合到了stringtypes本身中 – 通过从中构build一个string来将types转换为string。 而不是5.to_s ,你有str(5)

不要被愚弄。 幕后还有一个方法 – 这就是为什么这个代码工作的原因:

 (5).__str__() 

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

相当于你在你的问题中写的python将是:

 (5).__add__(6) 

另一个重要的差异是如何实施全球function。 在Python中,全局variables由一个字典来表示(和本地一样)。 这意味着以下内容:

 foo(5) 

在python中相当于这个:

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

而ruby有效地做到这一点:

 Object.foo(5) 

这对以两种语言编写代码时使用的方法有很大的影响。 Ruby库倾向于通过将方法添加到像Object这样的现有types来增长,而Python库通过将全局函数添加到给定模块而趋于增长。

回答你的第二个问题,是的:

 >>> (1).__add__(2) 3 

例如, if不是“一个对象”,而是一个关键字,用于在列表推导和生成器expression式中启动一个条件语句或(在Python中), if Python和Ruby都是“一切”。 找出函数,类,方法以及所有类似于C ++的对象(例如C ++)的热情都是Ruby或Python中的对象,引起了这样的热情。 其他的东西可能是Ruby中的对象,但不是Python或反之亦然(代码块,正则expression式,…)。

是的,据我所知,一切都是Python中的一个对象。 当然,原始types和内buildtypes(int,long,str,float等)可以被分类 – 事实上,types本身就是对象。 函数是对象,类是对象,甚至代码块是某种意义上的对象…我不能想象任何东西在Python中不能被视为一个对象。

为其他人的优秀答案添加评论:一切都是一个对象,但是一些 – 特别是string和数字types – 是不可变的。 这意味着这些types在C或Java等语言(整数等不是对象)的语言中的行为方式与赋值,parameter passing等方面相同,您不必担心由传递引起的陷阱,参考。 这是一个很好的解决scheme:-)