【问题标题】:Python: functions in a class and memoryPython:类和内存中的函数
【发布时间】:2012-08-13 17:42:41
【问题描述】:

如果我有一个具有多个功能的类:

class Example:

    def func1(self):
        print 'Hi1'
    def func2(self):
        print 'Hi2'
    def func3(self):
        print 'Hi3'

如果我创建了“Example”的多个实例,每个实例是否都在类中存储自己的函数副本?或者 Python 是否有一种聪明的方法来只存储一次定义并在每次实例使用类中的函数时查找它?

另外,静态函数呢?该类是否只保留每个静态函数的一份副本?

【问题讨论】:

  • 我不确定我是否理解这意味着性能差异。
  • 我正在实例化一个类的数百万个实例,所以我需要了解内存将如何受到影响。

标签: python function memory instances


【解决方案1】:

实例化一个类时,不会创建新的函数对象,无论是实例方法还是静态方法。通过obj.func1 访问实例方法时,会创建一个称为“绑定方法”的新包装对象,该对象只会在需要时保留。包装器对象是轻量级的,基本上包含一个指向底层函数对象和实例的指针(在调用函数时作为self 参数传递)。

请注意,在 Python 中使用 staticmethod 几乎总是一个错误。它的存在归功于一个历史错误。如果您认为需要静态方法,通常需要模块级函数。

【讨论】:

  • 说得很好,也很容易理解——关于静态方法的很好的说明
  • 另请注意,函数对象本身可以(并且确实)共享字节码,而 IIRC 仅在其之上添加一些元数据(名称、模块、文档字符串、捕获的变量等)。
  • @delnan:这仅适用于 local 函数,即在函数内部定义的函数。类体只执行一次,对于类体中的函数,函数对象和代码对象是一一对应的。
  • @SvenMarnach 真的吗?在带有def f() { def g(): pass; return g } 的Python 3.2 上,f().__code__ is f().__code__ 是正确的。而且我不明白为什么在 2.x 中不会出现这种情况,因为代码对象显然在很长一段时间内都是不可变的。
  • @delnan:我看不出你的观察(这对 Python 2.x 也有效)和我的评论有任何矛盾。
【解决方案2】:

函数“存储”在类中,包括静态和非静态的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2021-06-25
    • 1970-01-01
    • 2015-08-28
    • 2023-02-09
    • 1970-01-01
    相关资源
    最近更新 更多