Python:类和内存中的函数

Python:类和内存中的函数,python,function,memory,instances,Python,Function,Memory,Instances,如果我有一个具有多个函数的类: class Example: def func1(self): print 'Hi1' def func2(self): print 'Hi2' def func3(self): print 'Hi3' 如果我创建几个“Example”实例,每个实例是否在类中存储自己的函数副本?或者Python是否有一种聪明的方法,只存储一次定义,并在每次实例使用类中的函数时查找它 还有,静态函数呢?类是

如果我有一个具有多个函数的类:

class Example:

    def func1(self):
        print 'Hi1'
    def func2(self):
        print 'Hi2'
    def func3(self):
        print 'Hi3'
如果我创建几个“Example”实例,每个实例是否在类中存储自己的函数副本?或者Python是否有一种聪明的方法,只存储一次定义,并在每次实例使用类中的函数时查找它


还有,静态函数呢?类是否只保留每个静态函数的一个副本?

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


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

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

我不确定我是否理解这意味着性能上的差异。我正在实例化一个类的数百万个实例,因此,我需要了解内存将如何受到影响。很好地表达和理解——关于staticmethod的一个很好的说明,也要注意函数对象本身可以(并且确实)共享字节码,IIRC只添加一点元数据(名称、模块、docstring、捕获的变量等)最重要的是。@delnan:这只适用于局部函数,即在函数中定义的函数。类主体只执行一次,对于类主体中的函数,函数对象和代码对象之间存在一对一的对应关系。@SvenMarnach真的吗?在Python3.2上,使用
def(){def g():pass;return g}
,我得到了
f()的真值。我不明白为什么在2.x中不是这样,因为代码对象很长一段时间以来显然是不可变的。@delnan:我看不出你的观察(对Python 2.x也是有效的)和我的评论之间有任何矛盾。