class Package:
def __init__(self):
self.files = []
# ...
def __del__(self):
for file in self.files:
os.unlink(file)
上面的__del__(self)失败,出现AttributeError异常。我理解当调用__del__()时,Python不保证存在“全局变量”(在此上下文中是成员数据?)如果是这种情况,这是异常的原因,我如何确保对象销毁正确?
只要用try/except语句包装你的析构函数,如果你的全局变量已经被处理了,它就不会抛出异常。
Edit
试试这个:
from weakref import proxy
class MyList(list): pass
class Package:
def __init__(self):
self.__del__.im_func.files = MyList([1,2,3,4])
self.files = proxy(self.__del__.im_func.files)
def __del__(self):
print self.__del__.im_func.files
它会将文件列表填充到del函数中,该函数保证在调用时存在。weakref代理是为了防止Python或您自己删除self。Files变量(如果它被删除,那么它不会影响原始文件列表)。如果即使有更多对变量的引用,也没有删除该变量,那么可以删除代理封装。
atexit。在ostrakach的回答中已经提到过,寄存器是标准的方式。
但是,必须注意的是,不能依赖于对象可能被删除的顺序,如下例所示。
import atexit
class A(object):
def __init__(self, val):
self.val = val
atexit.register(self.hello)
def hello(self):
print(self.val)
def hello2():
a = A(10)
hello2()
a = A(20)
在这里,顺序似乎是合法的,因为它与创建对象的顺序相反,程序给出的输出如下:
20
10
然而,在一个较大的程序中,当python的垃圾收集启动超出其生命周期的对象时,将首先被销毁。