像ruby一样,python中的所有东西都是对象吗?

Is everything an object in python like ruby?

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

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

这两个在这方面有什么不同,还是真的一样?例如,你能拿一个数字来做我见过的红宝石的事情吗?

1
y = 5.plus 6

在Python中也可以这样做吗?


一切都是一个物体

Everything in Python is an object, and almost everything has attributes and methods. All functions have a built-in attribute __doc__, which returns the doc string defined in the function's source code. The sys module is an object which has (among other things) an attribute called path. And so forth.

Still, this begs the question. What is an object? Different programming languages define"object" in different ways. In some, it means that all objects must have attributes and methods; in others, it means that all objects are subclassable. In Python, the definition is looser; some objects have neither attributes nor methods (more on this in Chapter 3), and not all objects are subclassable (more on this in Chapter 5). But everything is an object in the sense that it can be assigned to a variable or passed as an argument to a function (more in this in Chapter 4).

Ruby文档-从python到ruby

As with Python, in Ruby,... Everything is an object

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


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

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

不过,别被骗了。在幕后还有一个方法——这就是这个代码工作的原因:

1
(5).__str__()

所以在实践中,两者基本上是相似的,但是你使用它们的方式不同。python中的list和tuples等序列的长度是这一原理在工作中的另一个例子——实际特性是建立在具有特殊名称的方法之上的,但是通过一个更简单、更易于使用的接口(len函数)暴露出来的。

因此,相当于您在问题中所写内容的python将是:

1
(5).__add__(6)

另一个重要的区别是如何实现全局函数。在python中,全局由一个字典表示(局部也是如此)。这意味着:

1
foo(5)

在python中相当于:

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

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

1
Object.foo(5)

这对用两种语言编写代码时使用的方法有很大的影响。Ruby库倾向于通过向现有类型(如对象)添加方法来增长,而Python库倾向于通过向给定模块添加全局函数来增长。


"Everything"有点夸张,对于python和ruby来说——例如,if不是"对象",而是用于启动条件语句或(在python中)列表理解和生成器表达式的关键字。发现函数、类、方法以及所有那些不是真正的对象(如C++)的热情,是Ruby或Python中的对象,引起了这种热情。其他可能是Ruby中的对象,但不是Python或Viceversa(代码块、正则表达式…)。


回答第二个问题,是:

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


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


在别人的优秀答案中添加一条评论:一切都是一个对象,但有些(特别是字符串和数字类型)是不可变的。这意味着这些类型的行为就像C或Java语言(其中整数等不是对象)关于赋值、参数传递等的行为,而且您永远不必担心通过引用引起的陷阱。这是一个相当好的解决方案:—)