2009-06-03 10 views
5

Esiste un metodo che posso aggiungere al mio modulo, che verrà chiamato quando si distrugge la classe?Metodo che viene chiamato sulla cancellazione del modulo in Python

abbiamo una semplice classe che ha le funzioni di membro solo statiche e ha bisogno di ripulire la connessione al database, quando lo scarico del modulo.

Speravo ci sarebbe un metodo __del__ sia per i moduli o classi che non hanno istanze?

+0

Che cosa intendi per "cancellazione del modulo"? Quando pensi che questo accada? –

+0

abbiamo una semplice classe che ha solo funzioni membro statiche e ha bisogno di ripulire la connessione al database quando si scarica il modulo. speravo che ci sarebbe stato un metodo __del__ per i moduli o le classi che non hanno istanze? – Dan

+0

@Dan: aggiorna la domanda con nuove informazioni; non commentare sulla tua stessa domanda. Inoltre, qual è il caso d'uso per lo scarico di un modulo? Perché dovresti farlo? –

risposta

17

Quando si distrugge quale classe? Ho detto modulo?

Il modulo rimane in attesa dell'interruttore. è possibile aggiungere qualcosa per l'esecuzione in quel momento con il modulo "atexit":

import atexit 
atexit.register(myfunction) 

EDIT: In base alle vostre osservazioni.

Poiché non lo si vuole come distruttore, la mia risposta sopra è corretta. Basta def un'altra funzione (o un metodo statico se lo si desidera) e registrarlo con l'atexit:

def close_database(): 
    proceed_to_close() 

import atexit 
atexit.register(close_database) 

Ora una breve nota dalla vostra definizione.

Hai detto che la classe non ha istanze. Allora, perché renderlo un corso? Perché non definire le funzioni nel livello del modulo, invece? I moduli sono oggetti di prima classe, nella cache e importati solo una volta ...

Esempio, invece di definire 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) 

e l'utilizzo di:

from database import DataBase 
DataBase.execute_some_query(query) 

Si potrebbe fare questo invece su database.py :

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

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

E usarlo come è:

import database 
database.execute_some_query(query) 

O meglio ancora: Usa sqlalchemy ed evitare tutti questi problemi di creare il proprio database interface.

-1

utilizzare il metodo del:

class Foo: 

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

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

Assicurati di leggere http://docs.python.org/reference/datamodel.html#object.__del__ –

+1

__init__ non è il costruttore. Se usi __del__ potrebbe essere possibile che gc non raccolga l'oggetto, quindi in generale è meglio evitare __del__ se puoi. – DasIch

+0

__init__ non è il costruttore? Sono confuso ... – ismail

1

Il metodo della classe distruttore che stai cercando è __del__. Ci sono alcune sfumature a quando viene chiamato e su come devono essere gestite le eccezioni e le sottoclassi in __del__, quindi assicurati di leggere lo official docs.

Una nota veloce anche sulla terminologia: in python uno module è il file in cui si trova il codice ... uno spazio dei nomi, in sostanza. Un singolo modulo può contenere molte classi, variabili e funzioni. Il metodo __del__ si trova sulla classe, non sul modulo.

-1

Testato utilizzando 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

Hai rientrato la chiamata 'register' in modo che appartenga alla classe, ma la classe non esiste ancora. Confronta ciò che hai fatto con i vari esempi nella risposta accettata. – DSM

+0

Ah, ok. Non mi rendevo conto che la classe non esiste a questo punto. – user2153867

Problemi correlati