【问题标题】:Python data model / internal methodsPython数据模型/内部方法
【发布时间】:2021-01-05 10:10:15
【问题描述】:

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

考虑以下代码:

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

所以我可以这样做:

num.__add__(1) 
>>> 1338

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

【问题讨论】:

  • 所以你可以为任何你想要的类定义+和其他操作。 (是的,可能还有其他方法可以做到这一点,但这就是 Python 的做法。)另外,Python 中的 int 并不像 C 中的 int 那样完全是“基本”数据类型,因为它可以保持任意大值。
  • 您究竟在哪里看到了内存开销?我不知道任何语言都会消耗大量内存的方法。该方法附加到类,它是一个指向函数的指针,因此成本不会太高。在这些方法的实现中可能会占用大量内存,但您无法从您所展示的内容中看出这种情况。据我所知,每个单独的对象都没有额外的内存成本。

标签: python python-3.x class types magic-methods


【解决方案1】:

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

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

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

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


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

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


如果您担心内存优化和极端性能,您可能应该查看一些较低级别的语言,例如 CGo

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

【讨论】:

    【解决方案2】:

    为什么有这么多方法

    Python 是一种面向对象的 语言。它建立在相互交互的对象之上。也许 Python 必须是面向对象的并没有什么特别的原因,但是编写它的人可以决定它是什么类型的语言,然后他选择了这种类型。

    在 Python 中,对象决定如何实现操作。这就是为什么你可以拥有像'str1' + 'str2'23 + 40 这样的自然语法。请注意,这些都是以相同的方式编写的,但是会产生不同的结果,因为+ 操作是在不同的对象上执行的。

    内存管理呢

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      • 2012-02-24
      • 1970-01-01
      • 2016-05-23
      • 2022-11-21
      相关资源
      最近更新 更多