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

joh*_*nny 46 ruby python language-comparisons object

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

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

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

y = 5.plus 6
Run Code Online (Sandbox Code Playgroud)

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

Unk*_*own 69

DiveIntoPython - 一切都是对象

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

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

Ruby Docs - 来自Python的Ruby

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

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

  • "但是,从某种意义上讲,一切都是一个对象,它可以被赋值给一个变量,或作为一个参数传递给一个函数(在第4章中更多内容)." 这对我没有任何意义.这不会成为Java int对象吗? (24认同)
  • @JamesMcMahon是的,你是对的!! 以上回答没有回答这个问题!! 如果我们阅读Guido的[博客](http://python-history.blogspot.in/2009/02/first-class-everything.html),它会说:"我的Python目标之一就是让所有对象是"头等舱".通过这个,我的意思是我希望所有可以在语言中命名的对象(例如,整数,字符串,函数,类,模块,方法等)具有相同的状态.也就是说,它们可以分配给变量,放在列表中,存储在字典中,作为参数传递,等等 (4认同)
  • +1好放.作为一个Rubyist,我倾向于参与"对象必须有方法"的一面,但是"一切都可以作为参数传递"的论点很好(我怀疑更好地反映了Pythonista的观点) (2认同)
  • 我也可以说:"在某种意义上它们是用CPython中的钩子作为其他对象实现相同的固有结构/位置的意义上的对象"...... (2认同)

Kat*_*add 40

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

例如,虽然Ruby在Object基类上为您提供了'to_s'方法,但为了公开该功能,Python将其集成到字符串类型本身 - 您通过从中将字符串构造为字符串将其转换为字符串.而不是5.to_s,你有str(5).

不过,不要被愚弄.幕后还有一种方法 - 这就是为什么这段代码有效:

(5).__str__()
Run Code Online (Sandbox Code Playgroud)

所以在实践中,两者基本相似,但你使用它们的方式不同.Python中列表和元组之类的序列的长度是这个原理工作的另一个例子 - 实际的特性建立在具有特殊名称的方法之上,但是通过更简单,更易于使用的界面(len函数)公开.

因此,你在问题中写的python相当于:

(5).__add__(6)
Run Code Online (Sandbox Code Playgroud)

另一个重要的区别是全球功能的实施方式.在python中,全局变量由字典表示(就像本地人一样).这意味着以下内容:

foo(5)
Run Code Online (Sandbox Code Playgroud)

在python中等效于此:

globals()["foo"].__call__(5)
Run Code Online (Sandbox Code Playgroud)

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

Object.foo(5)
Run Code Online (Sandbox Code Playgroud)

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

  • 我试图理解为什么我能做"1".__ eq __("2")=> False,但不是1 .__ eq __(2)=> SyntaxError:语法无效.你的答案显示我需要括号,例如,(1).__ eq __(2).奇怪的是,@ RichieHindle的1 ..__添加__(2)有效,但不是单一时期.为什么是这样? (2认同)

Ale*_*lli 21

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

  • 是的,但是即使在smalltalk上,“ if”也是一种阻止方法(ruby上的Proc / lambda,python上的lambdas,与语言无关的家伙的闭包),并且一切都是对象,其关键字为true,false,nil,自我,超级和thisContext。当然,这些更像是伪变量... (4认同)

Ric*_*dle 20

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

>>> (1).__add__(2)
3
Run Code Online (Sandbox Code Playgroud)

  • @dF:你的第一个例子,在"1."之后使用了一个空格,在3.2.3中不适用于我=> SyntaxError:语法无效 (3认同)
  • 该空间应该位于1和点之间:D`1 .__ add __(2)` (3认同)
  • 是的.甚至`1.__add __(2)`(注意空格).甚至可以用于花车:`1 ..__添加__(2)`. (2认同)