当我遇到使用垃圾收集器进行实例/类清理的一点问题时,我试图处理@classmethod
和@staticmethod
:
class A:
count = 0
def __init__(self, x):
A.count += 1
self.x = x
print("A instance created :")
A.class_foo()
def __del__(self):
print("destructor :")
print("A instance (%d) deleted :" % self.x)
A.count -= 1
A.class_foo()
@classmethod
def class_foo(cls):
print("Class A count : " + str(cls.count))
if __name__ == "__main__":
a1 = A(1)
a2 = A(2)
del a1
#del a2
运行以下代码时,我得到以下内容:
$ python test.py
A instance created :
Class A count : 1
A instance created :
Class A count : 2
destructor :
A instance (1) deleted :
Class A count : 1
destructor :
A instance (2) deleted :
Exception AttributeError: "'NoneType' object has no attribute 'count'" in <bound method A.__del__ of <__main__.A instance at 0x1067fe098>> ignored
当垃圾收集器删除剩余的实例时,看起来A
不再存在。
有没有办法强制垃圾收集器使用的删除顺序?或明确删除每个实例/类是避免此类问题的唯一方法? (例如,在我的代码中取消注释del a2
时,我没有这个错误。)
编辑:
这是我使用的python:
Python 3.5.1(默认,2016年4月4日,12:30:47)[GCC 4.2.1兼容 darwin上的Apple LLVM 7.3.0(clang-703.0.29)]
由于垃圾收集器行为可能依赖于Python实现,我认为这可能很重要。