Python内存分配,使用绑定,静态或类函数时?

时间:2015-07-31 22:27:13

标签: python

我对此很好奇:一旦你创建了一个包含这些函数中的每一个的类,python对象实际上会发生什么?

看一些例子,我看到bound,static或class函数实际上是创建一个类对象,它包含所有3个函数。

无论我打电话给哪个功能,这总是如此吗?并且总是调用父对象类(在这种情况下为对象,但可以是任何我想的),因为我的类中的构造函数是隐式调用它的?

class myclass(object):
    a=1
    b=True

    def myfunct(self, b)
        return (self.a + b)

    @staticmethod
    def staticfunct(b):
        print b

    @classmethod
    classfunct(cls, b):
        cls.a=b

由于不清楚:当我使用它时,这个对象类的生命周期是什么?

from mymodule import myclass

class1 = myclass()
class1.staticfunct(4)
class1.classfunct(3)
class1.myfunct

在static的情况下,myclass对象被分配,然后运行该函数,但是没有生成类和绑定方法?

在类功能的情况下,它与上面相同吗?

在绑定函数的情况下,类中的所有内容都已分配?

3 个答案:

答案 0 :(得分:1)

class语句创建该类。这是一个具有所有三个函数的对象,但第一个(myfunct)是未绑定的,如果没有此类的实例对象则无法调用。

此类的实例(如果您创建它们)将具有此函数的绑定版本以及对静态和类函数的引用。

因此,类和实例都具有所有三个函数。

但这些函数中没有一个创建类对象。这是由class语句完成的。 (确切地说:当解释器完成类创建时,即当创建其中的函数时该类尚不存在;令人难以置信,但很少需要知道。)

如果你没有覆盖__init__()函数,它将被继承并为每个创建的实例调用,是的。

答案 1 :(得分:1)

  

由于不清楚:这个对象类的生命周期是什么,   当我用它作为以下?

from mymodule import myclass

这将创建所有函数的类和代码。它们将是classmethod,staticmethod和方法(你可以在它们上面使用type()看到它们)

class1 = myclass()

这将创建一个类的实例,它有一个字典和许多其他东西。但它对你的方法没有任何作用。

class1.staticfunct(4)

这会调用你的staticfunct。

class1.classfunct(3)

这称你为classfunct

class1.myfunct

这将创建一个新对象,它是class1的绑定myfunct方法。如果要反复调用它,将它绑定到变量通常很有用。但是这种绑定方法具有正常的生命周期。

以下是您可能会发现的示例:

>>> class foo(object):
...     def bar(self):
...         pass
... 
>>> x = foo()
>>> x.bar is x.bar
False

每次访问x.bar时,它都会创建一个新的绑定方法对象。

另一个显示类方法的例子:

>>> class foo(object):
...  @classmethod
...  def bar():
...     pass
... 
>>> foo.bar
<bound method type.bar of <class '__main__.foo'>>

答案 2 :(得分:0)

您的类myclass实际上有四个重要的方法:显式编码的三个方法和继承自__init__的构造函数object。只有构造函数才能创建新实例。因此,在您的代码中,会创建一个名为class1的实例(名称选择不当)。

myfunct通过将class1.a添加到4来创建一个新整数.class1的生命周期不受影响,变量class1.a,class1.b,myclass.a或myclass.b也不受影响。< / p>

staticfunct只打印一些内容,myclass和class1的属性无关紧要。

classfunct修改变量myclass.a。它对class1的生命周期或状态没有影响。

永远不会使用或访问变量myclass.b;各个函数中名为b的变量引用函数参数中传递的值。

根据OP的评论添加了其他信息:

除了基本数据类型(int,chars,floats等)之外,Python中的所有内容都是一个对象。这包括类本身(类对象),每个方法(方法对象)和您创建的每个实例。创建后,每个对象都会保持活动状态,直到每个对象都消失为止然后它被垃圾收集。

所以在你的例子中,当解释器到达类语句体的末尾时,一个名为&#34; myclass&#34;的对象。存在,并且每个成员都有其他对象(myclass.a,myclass.b,myclass.myfunct,myclass.staticfunct等)。每个对象也有一些开销;大多数对象都有一个名为__dict__的成员和其他一些成员。当您实例化名为&#34; class1&#34;的myclass实例时,会创建另一个新对象。但是没有创建新的方法对象,也没有实例变量,因为你没有任何实例变量。 class1.a是myclass.a的假名,类似于方法。

如果你想摆脱一个对象,即把它收集垃圾,你需要消除对它的所有引用。对于全局变量,您可以使用&#34; del&#34;为此目的的陈述:

A = myclass() del A

将创建一个新实例并立即删除它,释放其资源以进行垃圾回收。当然,你随后不能使用该对象,例如print(A)现在会给你一个例外。