Nettoyer correctement les objets Python
La méthode __del__() est souvent utilisée pour nettoyer les ressources lorsqu'un objet Python est détruit. Cependant, s'appuyer sur __del__() peut être problématique en raison du système de récupération de place de Python, qui ne garantit pas l'existence de « variables globales » lors de l'invocation de __del__().
Pour garantir un nettoyage correct des objets, il est recommandé de utilisez l'instruction with de Python. L'instruction with prend une instance de classe comme argument et garantit que la méthode __enter__() de la classe est appelée à l'entrée et que sa méthode __exit__() est appelée à la sortie, quelles que soient les exceptions.
Considérez la classe de package suivante :
<code class="python">class Package: def __init__(self): self.files = [] # ... def __del__(self): for file in self.files: os.unlink(file)</code>
La méthode __del__() tente de supprimer tous les fichiers appartenant au package. Cependant, il peut échouer en raison de références manquantes à self.files. Pour résoudre ce problème, définissez les méthodes __enter__() et __exit__() comme suit :
<code class="python">class Package: def __init__(self): self.files = [] def __enter__(self): return self # ... def __exit__(self, exc_type, exc_value, traceback): for file in self.files: os.unlink(file)</code>
Maintenant, lorsque vous utilisez la classe Package avec une instruction with :
<code class="python">with Package() as package_obj: # use package_obj</code>
__enter__() est appelé à l'entrée et __exit__() est garanti d'être appelé à la sortie, garantissant un nettoyage correct des fichiers même en présence d'exceptions.
Pour éviter l'instanciation directe accidentelle de la classe Package sans utiliser l'instruction with, envisagez de créer un Classe PackageResource avec les méthodes __enter__() et __exit__() :
<code class="python">class PackageResource: def __enter__(self): class Package: ... self.package_obj = Package() return self.package_obj def __exit__(self, exc_type, exc_value, traceback): self.package_obj.cleanup()</code>
Avec cette approche, la classe Package ne peut être instanciée que dans une instruction with :
<code class="python">with PackageResource() as package_obj: # use package_obj</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!