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

时间:2009-05-14 21:33:03

标签: python ruby object language-comparisons

对另一个Stack Overflow问题的评论指出,Python就像Ruby一样,因为它与“一切都是对象”有关,而Python中的所有内容都是一个对象,就像Ruby一样。

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

两者在这方面有何不同或者它们是否真的相同?例如,你可以拿一个数字来做我看过的红宝石:

y = 5.plus 6

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

7 个答案:

答案 0 :(得分:68)

DiveIntoPython - Everything Is an Object

  

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

     

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

Ruby Docs - To Ruby From Python

  

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

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

答案 1 :(得分:37)

虽然一切都是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库往往通过向给定模块添加全局函数来增长。

答案 2 :(得分:19)

在回答第二个问题时,是的:

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

答案 3 :(得分:19)

对于Python和Ruby来说,“一切”都有点过头了 - 例如,if不是“对象”,而是用于启动条件语句的关键字或(在Python中)内部列表理解和生成器表达式。发现函数,类,方法以及所有那些在C ++中不是真正对象的东西的热情是Ruby或Python中的对象,引起了这种热情。其他东西可能是Ruby中的对象,但不是Python或反之(代码块,正则表达式......)。

答案 4 :(得分:2)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

你好,答案不是全部,参考比这更完整并提供更多途径,例如在 Python 3.8.5 中,分隔符、运算符和关键字不是对象。 stackoverflow.com/a/66374328/11554034

已在该链接中详细解释了它,请随时查看。

无论如何,下一个说你可以通过说来纠正它(更正确的,尽管如果仍然可以更完整,请随意): “逻辑行中除 NEWLINE、INDENT、DEDENT、空格字符、运算符、关键字或分隔符之外的所有内容都是 Python 中的对象。”

干杯。