Python 中的一切都是对象,就像 Ruby 一样吗?
- 2025-01-15 08:45:00
- admin 原创
- 144
问题描述:
我在另一个 Stack Overflow 问题上看到,Python 就像 Ruby 一样,因为它与“一切皆对象”有关,并且 Python 中的一切都是对象,就像 Ruby 一样。
这是真的吗?Python 中的一切都是对象,就像 Ruby 一样吗?
在这方面两者有何不同,或者它们真的相同吗?例如,你能否接受一个数字并执行我见过的 Ruby 操作,例如:
y = 5.plus 6
可以在 Python 中以同样的方式完成吗?
解决方案 1:
DiveIntoPython - 一切皆对象
Python 中的一切都是对象,几乎所有东西都有属性和方法。所有函数都有一个内置属性
__doc__
,它返回doc string
函数源代码中定义的。sys
模块是一个对象,它(除其他外)具有一个名为的属性path
。等等。但这又引出了一个问题。什么是对象?不同的编程语言对“对象”的定义不同。在某些语言中,它意味着所有对象都必须具有属性和方法;在其他语言中,它意味着所有对象都是可子类化的。在 Python 中,定义比较宽松;有些对象既没有属性也没有方法(更多内容请参见第 3 章),并且并非所有对象都是可子类化的(更多内容请参见第 5 章)。但一切都是对象,因为它可以分配给变量或作为参数传递给函数(更多内容请参见第 4 章)。
Ruby 文档 - 从 Python 到 Ruby
与 Python 一样,在 Ruby 中......一切都是对象
所以你可以从 Ruby 自己的网站上了解到:在 Python 中一切都是对象。
解决方案 2:
尽管 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 库往往通过向给定模块添加全局函数而增长。
解决方案 3:
对于 Python 和 Ruby 来说,“一切”都有点过分了——例如,if
它不是“一个对象”,而是用来启动条件语句或(在 Python 中)列表推导和生成器表达式中的关键字。函数、类、方法以及所有这类在(比如)C++ 中不是真正对象的东西在 Ruby 或 Python 中都是对象,这种热情引起了人们的热情。其他东西在 Ruby 中可能是对象,但在 Python 中不是,反之亦然(代码块、正则表达式等)。
解决方案 4:
对于你的第二个问题,答案是肯定的:
>>> (1).__add__(2)
3
解决方案 5:
是的,据我所知,Python 中的一切都是对象。当然,原始类型和内置类型(int、long、str、float 等)可以子类化 - 事实上,类型本身就是对象。函数是对象,类是对象,甚至代码块在某种意义上也是对象……我想不出 Python 中有什么不能被视为对象的东西。
解决方案 6:
你好,答案是出乎意料的,不是全部,参考资料比这更完整,并提供了更多的途径,例如在 Python 3.8.5 中,分隔符、运算符和关键字不是对象。stackoverflow.com/a/66374328/ 11554034
已在该链接中详细解释过,请随意查看。
无论如何,下一条说的是你可以通过以下说法来纠正它(更正确的,尽管如果仍然可以更完整,请随意):
“逻辑行中不是 NEWLINE、INDENT、DEDENT、空格键字符、运算符、关键字或分隔符的所有内容都是 Python 中的对象。”
干杯。
解决方案 7:
对其他人的优秀答案添加一条评论:一切都是对象,但有些(尤其是字符串和数字类型)是不可变的。这意味着这些类型的行为方式与 C 或 Java 等语言(其中整数等不是对象)中的行为方式相同,涉及赋值、参数传递等,并且您永远不必担心通过引用传递造成的陷阱。这是一个很好的解决方案 :-)
解决方案 8:
是的,据我研究,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
扫码咨询,免费领取项目管理大礼包!