3

在 Python 中,类属性的生命周期是多少?如果当前没有该类的实例处于活动状态,那么该类及其类属性是否会被垃圾收集,然后在下次使用该类时重新创建?

例如,考虑以下内容:

class C(object):
    l = []

    def append(self, x):
        l.append(x)

假设我创建了 的一个实例C,将 5 附加到C.l,然后该实例C不再被引用并且可以被垃圾回收。稍后,我创建另一个实例C并读取C.l. 我保证C.l会持有[5]吗?或者类本身和它的类属性是否有可能被垃圾收集,然后C.l = []第二次执行?

或者,换一种说法:类属性的生命周期是“永远”的吗?类属性是否与全局变量具有相同的生命周期?

4

2 回答 2

4

你问了几个问题。

在 Python 中,类属性的生命周期是多少?

只要有对它的引用,类属性就存在。由于类持有引用,假设类继续持有引用,它将至少与类一样存在。此外,由于每个对象都拥有一个引用,因此假设每个对象都继续拥有该引用,那么它将至少与所有对象一样长。

我保证C.l会持有[5]吗?

在你描述的假设中,是的。

或者类本身和它的类属性是否有可能被垃圾收集,然后C.l = []第二次执行?

没有给出您能够构造C. 如果您能够构造 , 的第二个实例C,则C必须存在,因此也必须存在C.l

类属性的生命周期是否“永远”?

不,类属性的生命周期遵循任何对象的生命周期规则。只要存在对它的引用,它就存在。在 的情况下C.l,类中存在引用,并且每个实例中都存在引用。如果你摧毁所有这些,那么C.l也将被摧毁。

类属性是否与全局变量具有相同的生命周期?

排序:类属性一直存在,直到最后一个引用消失。全局变量也存在,直到最后一个引用消失。这些都不能保证持续整个程序的持续时间。

此外,在模块范围内定义的类全局变量。因此,在这种情况下,类(以及隐含的属性)与全局变量具有相同的生命周期。

于 2016-12-06T19:46:32.103 回答
2

如果当前没有该类的实例处于活动状态,那么该类及其类属性是否会被垃圾收集,然后在下次使用该类时重新创建?

不,已经被垃圾收集的类没有“下一次使用”,因为它可以被垃圾收集的唯一方法是如果没有办法使用它。

假设我创建了 的一个实例C,将 5 附加到C.l,然后该实例C不再被引用并且可以被垃圾回收。稍后,我创建另一个实例C并读取C.l. 我保证C.l会持有[5]吗?

是的。该类具有实时引用,因为您创建了另一个实例,并且列表具有实时引用作为类的属性。

类属性是否与全局变量具有相同的生命周期?

如果该类持有对某事物的引用,则该事物将至少与该类一样长。

于 2016-12-06T19:38:39.357 回答