__del__
est un finaliseur . Il est appelé lorsqu'un objet est garbage collection, ce qui se produit à un moment donné après que toutes les références à l'objet ont été supprimées.
Dans un cas simple, cela peut être juste après que vous ayez dit del x
ou, s'il x
s'agit d'une variable locale, après la fin de la fonction. En particulier, à moins qu'il y ait des références circulaires, CPython (l'implémentation standard de Python) effectuera immédiatement une récupération de place.
Cependant, il s'agit d'un détail d'implémentation de CPython. La seule propriété requise du garbage collection Python est que cela se produit après que toutes les références ont été supprimées, donc cela peut ne pas nécessairement se produire juste après et peut ne pas se produire du tout .
De plus, les variables peuvent vivre longtemps pour de nombreuses raisons , par exemple, une exception de propagation ou une introspection de module peut maintenir le nombre de références de variables supérieur à 0. En outre, la variable peut faire partie du cycle de références - CPython avec garbage collection activé interrompt le plus , mais pas tous, de tels cycles, et même alors seulement périodiquement.
Puisque vous n'avez aucune garantie qu'il soit exécuté, il ne faut jamais mettre le code dans lequel vous devez être exécuté __del__()
- à la place, ce code appartient à la finally
clause du try
bloc ou à un gestionnaire de contexte dans une with
instruction. Cependant, il existe des cas d'utilisation valides pour __del__
: par exemple, si un objet X
référence Y
et conserve également une copie de Y
référence dans un global cache
( cache['X -> Y'] = Y
), il serait alors poli de X.__del__
supprimer également l'entrée du cache.
Si vous savez que le destructor fournit (en violation de la directive ci - dessus) un nettoyage nécessaire, vous voudrez peut - être appeler directement , depuis à ce sujet il n'y a rien de spécial comme méthode: x.__del__()
. Évidemment, vous ne devriez le faire que si vous savez que cela ne vous dérange pas d'être appelé deux fois. Ou, en dernier recours, vous pouvez redéfinir cette méthode en utilisant
type(x).__del__ = my_safe_cleanup_method