Python类属性的生命周期

时间:2016-12-06 19:33:56

标签: python lifetime class-attributes

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 = []再次执行?

或者,换句话说:类属性的生命周期是"永远"? class属性与全局变量的生命周期是否相同?

2 个答案:

答案 0 :(得分:4)

你问过几个问题。

  

Python属性的生命周期是什么?

只要有对它的引用,class属性就会存在。由于该类持有一个引用,它将至少在类生存时存活,假设该类继续保持引用。此外,由于每个对象都包含一个引用,它将至少与所有对象一样长,假设每个对象继续保持引用。

  

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

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

  

或者类本身及其类属性是否可能被垃圾收集,然后C.l = []再次执行?

没有假设您能够构建C的实例。如果您能够构建C的第二个实例,那么C必须存在,C.l

也必须存在
  

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

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

  

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

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

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

答案 1 :(得分:2)

  

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

没有。没有"下次使用"一个被垃圾收集的类,因为垃圾收集的唯一方法就是没有办法使用它。

  

假设我创建了C的实例,将{5}附加到C.l,然后不再引用C的实例,并且可以对其进行垃圾回收。稍后,我创建了另一个C实例,并读取C.l的值。我保证C.l会保留[5]吗?

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

  

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

如果班级持有某种东西的引用,那么这种东西至少和班级一样长。