Jestem ciekaw informacji na temat szczegółów __del__
w python, kiedy i dlaczego należy go używać i do czego nie należy go używać. Nauczyłem się na własnej skórze, że tak naprawdę nie jest to coś, co można by naiwnie oczekiwać od destruktora, ponieważ nie jest przeciwieństwem __new__
/__init__
.Jak wymusić usunięcie obiektu Pythona?
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()
widziałem w dokumentacji, że jest nie gwarantowane __del__()
metody są nazywane dla obiektów, które nadal istnieją, kiedy wyjść tłumacza.
- W jaki sposób można zagwarantować, że w przypadku wystąpienia jakichkolwiek wystąpień
Foo
po wyjściu interpretera pasek zostanie zamknięty? - w fragmencie kodu powyżej pasek zostanie zamknięty na
del foo
lub nagc.collect()
... czy też nie? jeśli chcesz dokładniej kontrolować te szczegóły (np. pasek powinien być zamknięty, gdy obiekt nie jest odwoływany), jaki jest zwykle sposób na jego implementację? - Po wywołaniu
__del__
jest zagwarantowane, że już zostało wywołane__init__
? a co jeśli podniósł się__init__
?
> Sposobem na zamknięcie zasobów są menedżerowie kontekstu, czyli instrukcja with. Doskonała wskazówka. Nie wiedziałem, że 'with' może być użyte do zawarcia zakresu dla dowolnego obiektu w ten sposób. –
Ta odpowiedź jest bardzo pouczająca. Dzięki za jasne wyjaśnienie! –