我在另一个Stack Overflow问题上读到,Python和Ruby非常相似,因为它们都关注"一切皆为对象",并且Python中的所有东西都像Ruby一样是对象。
这是真的吗?在Python中是否像Ruby一样,一切都是对象?
在这方面这两个语言有什么不同,还是它们确实是一样的?例如,您能否采取数字并执行类似于我所看到的Ruby操作:
y = 5.plus 6
在Python中可以用同样的方法吗?
我在另一个Stack Overflow问题上读到,Python和Ruby非常相似,因为它们都关注"一切皆为对象",并且Python中的所有东西都像Ruby一样是对象。
这是真的吗?在Python中是否像Ruby一样,一切都是对象?
在这方面这两个语言有什么不同,还是它们确实是一样的?例如,您能否采取数字并执行类似于我所看到的Ruby操作:
y = 5.plus 6
在Python中可以用同样的方法吗?
在 Python 中,所有的东西都是一个对象,几乎每个对象都有属性和方法。所有函数都有一个内置属性
__doc__
,它返回函数源代码中定义的文档字符串doc string
。模块sys
是一个对象,其中包含了(除其他外)一个名为path
的属性。等等。但这也引出了另一个问题,什么是对象?不同的编程语言对“对象”的定义有所不同。在某些编程语言中,“对象”意味着所有对象都必须拥有属性和方法;在其他编程语言中,“对象”意味着所有对象都可被子类化。在 Python 中,这个定义相对较宽松;有些对象既没有属性也没有方法(第三章会进一步讲解),而且并非所有对象都可以被子类化(第五章会进一步讲解)。但是,在 Python 中一切皆为对象,因为它们都可以被赋值给一个变量或作为参数传递给函数(第四章会详细讲解)。
与 Python 类似,在 Ruby 中......一切皆为对象。
所以,从 Ruby 的官方网站来看,Python 中的一切都是对象。
虽然Python中的所有东西都是对象,但在解析名称和与对象交互方面与Ruby不同。
例如,虽然Ruby在Object基类上提供了一个'to_s'方法,以公开该功能,但Python将其集成到字符串类型本身中-通过从中构造字符串将类型转换为字符串。而不是使用5.to_s
,你可以使用str(5)
。
不过,不要被骗了。幕后仍有一个方法-这就是为什么这段代码有效:
(5).__str__()
实际上,这两个在本质上是相似的,但你需要以不同的方式使用它们。Python中用于类似列表和元组等序列的长度就是此原则的又一个例子 - 实际功能是基于具有特殊名称的方法构建的,但通过更简单、易于使用的接口(len
函数)公开。
因此,与您在问题中编写的内容相当的Python代码为:
(5).__add__(6)
foo(5)
在 Python 中,相当于这样:
globals()["foo"].__call__(5)
虽然 Ruby 可以有效地完成这个任务:
Object.foo(5)
Object
)添加方法来增长,而 Python 库则通常通过向给定模块添加全局函数来增长。if
不是“一个对象”,而是关键字,用于启动条件语句或(在Python中)在列表推导和生成器表达式中使用。热情之余发现函数、类、方法等在(比如)C ++ 中并非真正的对象,而在Ruby或Python中却是对象,这引起了这样的热情。在Ruby中可能有其他东西是对象而在Python中不是,反之亦然(代码块、正则表达式等)。proc
、&
、&:
和define_method
将它们转换为Proc(一个对象)或从Proc转换回来。 - Pelleproc
、&
、&:
和define_method
将它们都转换为Proc
对象,而Proc
对象本身是一个对象。 - undefined回答你的第二个问题, 是的:
>>> (1).__add__(2)
3
1. __add__(2)
(注意空格)也可以使用。对于浮点数也适用:1..__add__(2)
。 - dF.1 .__add__(2)
。 - Vito De Tullio据我所知,Python中的所有东西都是对象。当然,原始类型和内置类型(int、long、str、float等)可以被子类化-实际上,这些类型本身就是对象。函数是对象,类是对象,甚至代码块在某种意义上也是对象... 我无法想象Python中有什么不能被视为对象的。
if
不是一个对象。 - Brian Spiering是的,根据我的研究,Python中的所有东西都是对象。
文档如下所示:
对象是Python中数据的抽象。Python程序中的所有数据都由对象或对象之间的关系表示。
每个对象都有一个身份、类型和值。
另外,我还检查了每个值的类型以及它们是否是特定类的实例,如下所示:
from types import FunctionType
class Person:
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(100 + 2j), isinstance(100 + 2j, complex))
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(Person), isinstance(Person, type))
print(type(test), isinstance(test, FunctionType))
输出:
<class 'str'> True
<class 'int'> True
<class 'float'> True
<class 'complex'> 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
nil
也是一个对象),但除此之外就变得更加棘手了。类是对象,方法不是。Proc是对象,块不是。(但是方法和块都可以转换为Proc)。绑定是对象,本地变量不是。等等... - Pellenil
也是一个对象),但除此之外就变得更加棘手了。类是对象,方法不是。Proc是对象,块不是。 (但是方法和块都可以转换为Proc)。绑定是对象,局部变量不是。等等... - undefined