__del__
jest finalizatorem . Jest wywoływana, gdy obiekt jest odśmiecany, co ma miejsce w pewnym momencie po usunięciu wszystkich odwołań do obiektu.
W prostym przypadku może to nastąpić zaraz po tym, jak powiesz del x
lub, jeśli x
jest to zmienna lokalna, po zakończeniu funkcji. W szczególności, jeśli nie ma odwołań cyklicznych, CPython (standardowa implementacja Pythona) natychmiast usunie elementy bezużyteczne.
Jest to jednak szczegół implementacji języka CPython. Jedyną wymaganą właściwością wyrzucania elementów bezużytecznych w Pythonie jest to, że dzieje się to po usunięciu wszystkich odniesień, więc może to nie być konieczne zaraz potem i może się nie zdarzyć w ogóle .
Co więcej, zmienne mogą istnieć przez długi czas z wielu powodów , np. Propagujący wyjątek lub introspekcja modułu może utrzymywać liczbę odwołań do zmiennej większą niż 0. Ponadto zmienna może być częścią cyklu odwołań - CPython z włączonym czyszczeniem pamięci powoduje przerwanie większości ale nie wszystkie takie cykle i nawet wtedy tylko okresowo.
Ponieważ nie masz gwarancji, że zostanie wykonany, nigdy nie należy umieszczać kodu, na który chcesz się natknąć __del__()
- zamiast tego kod ten należy do finally
klauzuli try
bloku lub do menedżera kontekstu w with
instrukcji. Jednak istnieją ważne przypadki użycia dla __del__
: np jeśli obiekt X
odniesienia Y
, a także przechowuje kopię Y
odniesienia w globalnej cache
( cache['X -> Y'] = Y
) to byłoby uprzejmy dla X.__del__
również usunąć wpis pamięci podręcznej.
Jeśli wiesz , że zapewnia destructor (naruszenie powyższej wytycznej) wymaganego czyszczenia, możesz nazwać to bezpośrednio , ponieważ nie ma nic szczególnego o nim jako o metodzie: x.__del__()
. Oczywiście powinieneś to zrobić tylko wtedy, gdy wiesz, że nie przeszkadza Ci dwukrotne wezwanie. Lub w ostateczności możesz przedefiniować tę metodę za pomocą
type(x).__del__ = my_safe_cleanup_method