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属性与全局变量的生命周期是否相同?
答案 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]
吗?
是。该类具有实时引用,因为您创建了另一个实例,并且该列表具有实时引用作为该类的属性。
类属性与全局变量的生命周期是否相同?
如果班级持有某种东西的引用,那么这种东西至少和班级一样长。