在Python中,一切都像Ruby一样是对象吗?

dy2hfwbg  于 2022-11-19  发布在  Python
关注(0)|答案(8)|浏览(137)

我在另一个Stack Overflow问题上读到,Python就像Ruby一样,因为它涉及到“一切都是对象”,Python中的一切都是对象,就像Ruby一样。
这是真的吗?Python中的所有东西都像Ruby一样是对象吗?
在这方面两者有什么不同,或者它们真的是一样的吗?例如,你能拿一个数字,做我见过的Ruby的事情吗:

y = 5.plus 6

在Python中也可以这样做吗?

of1yzvn4

of1yzvn41#

一切都是对象
Python中的所有东西都是对象,几乎所有东西都有属性和方法,所有函数都有一个内置的属性__doc__,它返回函数源代码中定义的doc stringsys模块是一个对象,它有一个名为path的属性,等等。
然而,这就引出了一个问题。什么是对象?不同的编程语言以不同的方式定义“对象”。在某些语言中,它意味着所有对象必须具有属性和方法;在其他语言中,它意味着所有的对象都是可子类的。有些对象既没有属性也没有方法(第3章会详细介绍),并且不是所有的对象都是可子类的(第5章会详细介绍)。2但是,从某种意义上说,所有的对象都可以被赋值给一个变量或者作为一个参数传递给一个函数(第4章会详细介绍)。
Ruby Docs - To Ruby From Python
与Python一样,在Ruby中,...一切都是对象
这是Ruby自己网站上的一个例子:在Python中,一切都是对象。

aydmsdu9

aydmsdu92#

虽然Python中的所有东西都是对象,但它与Ruby的不同之处在于解析名称和与对象交互的方法。
例如,Ruby在Object基类上提供了一个'to_s'方法,为了公开该功能,Python将其集成到字符串类型本身中--通过构造一个字符串将一个类型转换为字符串,而不是5.to_s
不过,不要被愚弄了。在后台仍然有一个方法-这就是为什么这段代码可以工作:

(5).__str__()

因此,在实践中,这两种方法基本上是相似的,但使用方式不同。Python中的列表和元组等序列的长度是这一原理的另一个例子--实际的特性是建立在具有特殊名称的方法上的,但通过一个更简单、更易于使用的接口(len函数)来公开。
因此,与您在问题中所写内容等效的Python将是:

(5).__add__(6)

另一个重要的区别是全局函数是如何实现的。在Python中,全局函数是用字典来表示的(就像局部函数一样)。这意味着:

foo(5)

在Python中等效于:

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

Ruby可以有效地做到这一点:

Object.foo(5)

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

uxh89sit

uxh89sit3#

对于Python和Ruby来说,“everything”有点过高--例如,if不是“一个对象”,而是一个用于启动条件语句的关键字,或者(在Python中)在列表解析和生成器表达式中。(比如)C++,是Ruby或Python中的对象,引起了这样的热情。其他东西可能是Ruby中的对象,但不是Python中的对象,反之亦然(代码块,正则表达式,...)。

tcbh2hod

tcbh2hod4#

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

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

i2loujxw5#

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

0yg35tkg

0yg35tkg6#

若要对其他人的优秀回答添加评论:所有的东西都是对象,但有些--特别是字符串和数字类型--是不可变的。这意味着这些类型在赋值、参数传递等方面的行为与它们在C或Java(其中整数等不是对象)等语言中的行为相同,而且你永远不必担心由引用传递引起的陷阱。这是一个相当好的解决方案:-)

qvsjd97n

qvsjd97n7#

Hello and answer is out of bat not everything,reference比这更完整,并提供了更多的途径,例如在Python 3.8.5中,分隔符、运算符和关键字不是对象。stackoverflow.com/a/66374328/11554034
已经解释了一些细节,在该链接沿着检查它。
无论如何,下一个说,语句你可以纠正它说(更正确的东西,虽然如果仍然可以更完整的感觉自由):“逻辑行中除NEWLINE、INDENT、DEDENT、空格键、字符、运算符、关键字或分隔符之外的所有内容都是Python中的对象。"
干杯干杯干杯

njthzxwz

njthzxwz8#

是的,只要我研究过,Python中的一切都是对象。

文件如下:

对象是Python对数据的抽象,Python程序中的所有数据都由对象或对象之间的关系表示。
每个对象都有一个标识、一个类型和一个值。
而且,我还检查了每个值的类型,以及它们是否都是特定类的示例,如下所示:

from types import FunctionType

class Test:
    pass

def test():
    pass

print(type("Hello"), isinstance("Hello", str))
print(type(100), isinstance(100, int))
print(type(100.23), isinstance(100.23, float))
print(type(True), isinstance(True, bool))
print(type(None), isinstance(None, type(None)))
print(type([]), isinstance([], list))
print(type(()), isinstance((), tuple))
print(type({}), isinstance({}, dict))
print(type({""}), isinstance({""}, set))
print(type(Test), isinstance(Test, type))
print(type(test), isinstance(test, FunctionType))

输出量:

<class 'str'> True
<class 'int'> True
<class 'float'> True
<class 'bool'> True
<class 'NoneType'> True
<class 'list'> True
<class 'tuple'> True
<class 'dict'> True
<class 'set'> True
<class 'type'> True
<class 'function'> True

相关问题