__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 xlub, jeśli xjest 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 finallyklauzuli trybloku lub do menedżera kontekstu w withinstrukcji. Jednak istnieją ważne przypadki użycia dla __del__: np jeśli obiekt Xodniesienia Y, a także przechowuje kopię Yodniesienia 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