Python 数据模型/内部方法

Python data model / internal methods

我想了解python(3.8.2)中的数据模型,所以也许有人可以简单地解释一下,为什么每个基本数据类型都是一个class对象并且有这么多的属性和功能。

考虑以下代码:

num = 1337
type(num)  # <class 'int'>
dir(num)
>>> 
['__abs__',
 '__add__',
 '__and__',
...
 'real',
 'to_bytes']

所以我可以做到:

num.__add__(1) 
>>> 1338

所以我的问题是:为什么这样的函数是用户定义变量的一部分,这不是有一些开销吗?

为什么这么多方法:

Python 是一种 object-oriented 语言。它建立在相互交互的对象之上。也许 Python 必须是 object-oriented 没有具体原因,但是编写它的人可以决定它是哪种语言,他选择了这种类型。

在Python中,对象决定如何实现操作。这就是为什么您可以使用像 'str1' + 'str2'23 + 40 这样的自然语法。请注意,它们都以相同的方式编写,但会产生不同的结果,因为 + 操作是在不同的 objects.

上执行的

内存管理呢:

如果对象没有决定如何实现操作,逻辑仍然必须存储在某个地方。它可能至少会占用一些内存。

问题是一个对象使用多少内存?为此,您可以使用 sys.getsizeof 函数:

import sys
print(sys.getsizeof(int))  # Prints size in bytes
>>> 416
print(sys.getsizeof(1))
>>> 28

所以,class(int)的内存比对象(1)大很多。这意味着整数的实例比它们的 classes 小得多,因此内存不会急剧膨胀。

“在 Python 中一切都是对象”,因此“一切”(也许不完全是一切,我不知道)是一个 class 实例并且具有潜在的属性和方法。

也就是说你必须知道,按照惯例,每个名称以 __ 开头的方法都被认为是私有的(并且几乎真正受到保护),你不应该直接使用它。

名称以 __ 开头和结尾的每个方法都称为 magic method 并且具有非常明确的角色。它们可以被视为一种绑定到对象生命周期中特定运算符或时刻的挂钩。

例如 __add__ 是绑定到 + 运算符的方法。当你做加法时,你实际上是在调用一个数字的 __add__ 方法,给它另一个数字作为参数。 如您所见,如果需要,您也可以直接调用 __add__ 方法,但不鼓励这样做。


Python 是一种 high-level 解释型语言。它提供了许多工具和清晰的语法,允许专注于实际问题而不是实现细节。

这些设施并非凭空而来,而是(除其他外)内部数据模型提供的好处。 这个数据模型当然不像专门为单个问题设计的自定义手工制作的 C 数据结构那样轻巧,但它在许多情况下都很实用且可用(并且仍然相当轻巧并且在许多用途中表现良好)。


如果您关心内存优化和 extreme-performance,您可能应该看看一些较低级别的语言,例如 CGo

但请记住,解决任何问题都可能需要更多时间:)