2012-08-13 50 views
6

功能。如果我有几个功能类:的Python:在一类和记忆

class Example: 

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

如果我创建“样本”的几个实例,确实每个实例存储自己的职能副本中的类?还是Python有一个聪明的方法来存储定义只有一次,并在每次实例使用类中的函数时查看它?

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

+0

我不确定我是否理解这将暗示的性能差异。 – rsegal 2012-08-13 17:46:19

+0

即时通讯实例化数百万个类的实例,所以我需要了解内存将如何受到影响。 – 2012-08-13 18:01:24

回答

12

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

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

+0

很好地说和易于理解 - 有关静态方法的好注意 – 2012-08-13 17:53:18

+0

还要注意,函数对象本身可以(并且确实)共享字节码,并且IIRC只添加一些元数据(名称,模块,docstring,捕获变量等)那。 – delnan 2012-08-13 18:13:13

+0

@delnan:这只适用于* local *函数,即函数内定义的函数。类体只执行一次,对于类体中的函数,函数对象和代码对象之间存在一一对应关系。 – 2012-08-13 18:26:49

0

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