对另一个Stack Overflow问题的评论指出,Python就像Ruby一样,因为它与“一切都是对象”有关,而Python中的所有内容都是一个对象,就像Ruby一样。
这是真的吗?像ruby一样,python中的所有东西都是对象吗?
两者在这方面有何不同或者它们是否真的相同?例如,你可以拿一个数字来做我看过的红宝石:
y = 5.plus 6
可以在Python中以相同的方式完成吗?
答案 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)
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 中的对象。”
干杯。