Как принудительно удалить объект python?

Мне любопытны подробности __ del __ в python, когда и почему его следует использовать и для чего его не следует использовать. Я на собственном горьком опыте убедился, что это не совсем похоже на то, что можно было бы наивно ожидать от деструктора, поскольку это не противоположность __ 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 , существующих при выходе из интерпретатора, панель закрывается?
  2. в приведенном выше фрагменте кода закрывается панель на del foo или gc.collect () ... или ни то, ни другое? если вам нужен более точный контроль над этими деталями (например, панель должна быть закрыта, когда объект не упоминается), как обычно это реализовать?
  3. при вызове __ del __ гарантировано ли, что __init __ уже звонили? как насчет того, чтобы __ init __ поднялся?
61
задан wim 4 December 2015 в 15:51
поделиться