如何强制删除一个Python对象?

14 浏览
0 Comments

如何强制删除一个Python对象?

我对Python中的__del__的细节很好奇,它应该在什么时候和为什么使用,以及它不应该用于什么。我通过痛苦的经验学到,它并不像人们最初期望的析构函数那样。它不是__new__ / __init__的相反操作。

class Foo(object):
    def __init__(self):
        self.bar = None
    def open(self):
        if self.bar != 'open':
            print 'opening the bar'
            self.bar = 'open'
    def close(self):
        if self.bar != 'closed':
            print 'closing the bar'
            self.bar = 'close'
    def __del__(self):
        self.close()
if __name__ == '__main__':
    foo = Foo()
    foo.open()
    del foo
    import gc
    gc.collect()

我在文档中看到__del__()方法不保证在解释器退出时仍存在的对象会被调用。

  1. 如何保证在解释器退出时,对于任何现存的Foo实例,bar都会关闭?
  2. 在上面的代码片段中,bar是在del foo还是在gc.collect()时关闭的...或者两者都不是?如果你想更精细地控制这些细节(例如,当对象没有引用时应该关闭bar),通常的实现方式是什么?
  3. 当调用__del__时,是否保证__init__已经被调用?如果__init__引发异常会怎样?
0