2009-06-03 5 views
5

Gibt es eine Methode, die ich meinem Modul hinzufügen kann, die beim Zerstören der Klasse aufgerufen wird?Methode, die bei Modullöschung in Python aufgerufen wird

Wir haben eine einfache Klasse, die nur statische Elementfunktionen hat und beim Entladen des Moduls die Datenbankverbindung bereinigen muss.

War die Hoffnung, dass es eine __del__ Methode für Module oder Klassen geben würde, die keine Instanzen haben?

+0

Was meinen Sie mit "Modullöschung"? Wann denkst du, dass das passiert? –

+0

Wir haben eine einfache Klasse, die nur statische Elementfunktionen hat und die Datenbankverbindung beim Entladen des Moduls bereinigen muss. Hatte ich gehofft, dass es eine Methode __del__ entweder für Module oder Klassen geben würde, die keine Instanzen haben? – Dan

+0

@Dan: Bitte aktualisieren Sie die Frage mit neuen Informationen; Kommentiere deine eigene Frage nicht. Was ist der Anwendungsfall für das Entladen eines Moduls? Wieso würdest du das machen? –

Antwort

17

Wann zerstören welche Klasse? Ich sagte du Modul?

Ihr Modul lebt bis der Interpreter stoppt. Sie können etwas hinzufügen zu dieser Zeit das „atexit“ Modul auszuführen:

import atexit 
atexit.register(myfunction) 

EDIT: Basierend auf Ihre Kommentare.

Da Sie es nicht als Destruktor wollen, ist meine Antwort oben korrekt. def einfach eine andere Funktion (oder statische Methode, wenn Sie möchten), und registrieren Sie es mit dem atexit:

def close_database(): 
    proceed_to_close() 

import atexit 
atexit.register(close_database) 

eine kurze Notiz von Ihrer Definition Jetzt.

Sie sagten, dass die Klasse keine Instanzen hat. Warum also eine Klasse machen? Warum definieren Sie nicht stattdessen die Funktionen auf der Modulebene? Module sind erstklassige Objekte, zwischengespeichert und nur einmal ...

Beispiel importiert, statt definieren 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) 

und mit:

from database import DataBase 
DataBase.execute_some_query(query) 

du auf database.py stattdessen tun könnte :

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

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

Und verwenden Sie es wie th ist:

import database 
database.execute_some_query(query) 

Oder noch besser: Mit sqlalchemy und vermeiden diese alle Probleme der eigenen Datenbank-Schnittstelle zu schaffen.

-1

Verwenden Sie das del Methode:

class Foo: 

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

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

Lesen Sie unbedingt http://docs.python.org/reference/datamodel.html#object.__del__ –

+1

__init__ ist nicht der Konstruktor. Wenn Sie __del__ verwenden, ist es möglich, dass das GC das Objekt nicht sammelt. Daher ist es besser, __del__ zu meiden, wenn Sie können. – DasIch

+0

__init__ ist nicht der Konstruktor? Ich bin verwirrt ... – ismail

1

Die Klassendestruktor Methode, die Sie für __del__ ist suchen. Es gibt einige Nuancen, wenn es aufgerufen wird, und wie Exceptions und Unterklassen in __del__ behandelt werden sollten, also lesen Sie unbedingt die official docs.

Eine kurze Anmerkung zur Terminologie auch: in Python ist eine module die Datei, in der sich Ihr Code befindet ... im Wesentlichen ein Namensraum. Ein einzelnes Modul kann viele Klassen, Variablen und Funktionen enthalten. Die Methode __del__ befindet sich in der Klasse und nicht im Modul.

-1

Getestet mit 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

Sie haben den Aufruf 'Register' eingerückt, sodass er Teil der Klasse ist, die Klasse jedoch noch nicht existiert. Vergleichen Sie, was Sie mit den verschiedenen Beispielen in der angenommenen Antwort getan haben. – DSM

+0

Ah, ok. Ich wusste nicht, dass die Klasse zu diesem Zeitpunkt nicht existiert. – user2153867

Verwandte Themen