我对此很好奇:一旦你创建了一个包含这些函数中的每一个的类,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对象被分配,然后运行该函数,但是没有生成类和绑定方法?
在类功能的情况下,它与上面相同吗?
在绑定函数的情况下,类中的所有内容都已分配?
答案 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)
现在会给你一个例外。