2009-06-03 5 views
5

Existe-t-il une méthode que je peux ajouter à mon module, qui sera appelée lors de la destruction de la classe?Méthode qui est appelée sur la suppression de module en Python

Nous avons une classe simple qui n'a que des fonctions membres statiques et qui a besoin de nettoyer la connexion à la base de données lors du déchargement du module.

Espérait qu'il y aurait une méthode __del__ soit pour les modules ou les classes qui n'ont pas d'instances?

+0

Qu'entendez-vous par "suppression de module"? Quand pensez-vous que cela arrive? –

+0

nous avons une classe simple qui a seulement des fonctions membres statiques et a besoin de nettoyer la connexion de base de données lors du déchargement du module. espérait qu'il y aurait une méthode __del__ soit pour les modules ou les classes qui n'ont pas d'instances? – Dan

+0

@Dan: S'il vous plaît mettre à jour la question avec de nouvelles informations; ne commente pas ta propre question. Aussi, quel est le cas d'utilisation pour décharger un module? Pourquoi voudriez-vous faire cela? –

Répondre

17

Lors de la destruction de quelle classe? Je pensais que tu as dit module?

Votre module reste actif jusqu'à ce que l'interpréteur s'arrête. vous pouvez ajouter quelque chose à courir à ce moment-là en utilisant le module "atexit":

import atexit 
atexit.register(myfunction) 

EDIT: Sur la base de vos commentaires.

Puisque vous ne le voulez pas en tant que destructeur, ma réponse ci-dessus est correcte. Il suffit de def une autre fonction (ou méthode statique si vous le souhaitez) et l'enregistrer avec l'atexit:

def close_database(): 
    proceed_to_close() 

import atexit 
atexit.register(close_database) 

maintenant une note rapide sur votre définition.

Vous avez dit que la classe n'a aucune instance. Alors pourquoi en faire un cours? Pourquoi ne pas définir les fonctions au niveau du module à la place? Les modules sont des objets de première classe, mis en cache et importés qu'une seule fois ...

exemple, au lieu de définir database.py:

class DataBase(object): 
    @staticmethod 
    def execute_some_query(query): 
     code_here() 
     some_code() 
    @staticmethod 
    def close_database(): 
     proceed_to_close() 
import atexit ; atexit.register(DataBase.close_database) 

et en utilisant:

from database import DataBase 
DataBase.execute_some_query(query) 

Vous pouvez le faire à la place sur database.py :

def execute_some_query(query): 
    code_here() 
    some_code() 

def close_database(): 
    proceed_to_close() 
import atexit ; atexit.register(close_database) 

Et l'utiliser comme est:

import database 
database.execute_some_query(query) 

Ou mieux encore: Utilisez sqlalchemy et éviter tout ce mal de créer votre propre interface de base de données.

-1

Utilisez la méthode del:

class Foo: 

    def __init__(self): 
     print "constructor called." 

    def __del__(self): 
     print "destructor called." 
+0

Assurez-vous de lire http://docs.python.org/reference/datamodel.html#object.__del__ –

+1

__init__ n'est pas le constructeur. Si vous utilisez __del__, il est possible que gc ne collecte pas l'objet, donc en général il vaut mieux éviter __del__ si vous le pouvez. – DasIch

+0

__init__ n'est pas le constructeur? Je suis confus ... – ismail

1

La méthode de la classe destructor que vous cherchez est __del__. Il y a quelques nuances quand il est appelé, et comment les exceptions et sous-classes doivent être traitées dans __del__, alors assurez-vous de lire le official docs.

Une note rapide sur la terminologie, aussi: en python, un module est le fichier dans lequel se trouve votre code ... un espace de noms, en substance. Un seul module peut contenir plusieurs classes, variables et fonctions. La méthode __del__ se trouve sur la classe, pas sur le module.

-1

Testé en utilisant bpython ...

>>> import atexit 
>>> class Test(object): 
...  @staticmethod 
...  def __cleanup__(): 
...   print("cleanup") 
...  atexit.register(Test.__cleanup__) 
... 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
    File "<input>", line 6, in Test 
NameError: name 'Test' is not defined 
+0

Vous avez indenté l'appel 'register' pour qu'il fasse partie de la classe, mais la classe n'existe pas encore. Comparez ce que vous avez fait avec les différents exemples de la réponse acceptée. – DSM

+0

Ah, d'accord. Je n'ai pas réalisé que la classe n'existe pas à ce stade. – user2153867

Questions connexes