2009-06-03 5 views
5

Есть ли способ, который я могу добавить в мой модуль, который будет вызван при разрушении класса?Метод, вызываемый при удалении модуля в Python

У нас есть простой класс, который имеет только статические функции-члены и должен очищать соединение с базой данных при разгрузке модуля.

Был ли надежда на применение метода __del__ для модулей или классов, не имеющих экземпляров?

+0

Что вы подразумеваете под "модуляцией"? Когда вы думаете, что это происходит? –

+0

У нас есть простой класс, который имеет только статические функции-члены и нуждается в очистке соединения с базой данных при разгрузке модуля. надеялся, что будет метод __del__ либо для модулей или классов, у которых нет экземпляров? – Dan

+0

@ Dan: обновите вопрос с новой информацией; не комментируйте свой вопрос. Кроме того, какой вариант использования для разгрузки модуля? Зачем вам это делать? –

ответ

17

При разрушении какого класса? Я, хотя вы сказали, что модуль?

Ваш модуль работает до тех пор, пока интерпретатор не остановится. Вы можете добавить что-то, чтобы работать в то время, используя модуль «atexit»:

import atexit 
atexit.register(myfunction) 

EDIT: на основе ваших комментариев.

Поскольку вы не хотите, чтобы это было деструктором, мой ответ выше правильный. Просто DEF другой функции (или статический метод, если вы хотите) и зарегистрировать его в atexit:

def close_database(): 
    proceed_to_close() 

import atexit 
atexit.register(close_database) 

Теперь краткое замечание по вашему определению.

Вы сказали, что у класса нет никаких случаев. Так почему же это класс? Почему бы не определить функции на уровне модуля вместо этого? Модули являются объектами первого класса, кэш и импортировать только один раз ...

Пример, вместо определения 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) 

и использование:

from database import DataBase 
DataBase.execute_some_query(query) 

Вы могли бы сделать это вместо того, чтобы на database.py :

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

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

И использовать его как является:

import database 
database.execute_some_query(query) 

Или еще лучше: Используйте sqlalchemy и избежать всех этих проблем создания своего собственного интерфейса базы данных.

-1

Используйте дель метод:

class Foo: 

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

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

Обязательно прочитайте http://docs.python.org/reference/datamodel.html#object.__del__ –

+1

__init__ не является конструктором. Если вы используете __del__, возможно, что gc не собирает объект, поэтому, в общем, лучше избегать __del__, если сможете. – DasIch

+0

__init__ не является конструктором? Я запутался ... – ismail

1

Метод класса деструктор вы ищете является __del__. Есть некоторые нюансы, когда он называется, а также то, как следует обрабатывать исключения и подклассы в __del__, поэтому обязательно прочтите official docs.

Быстрое примечание по терминологии тоже: in python a module - это файл, в котором находится ваш код ... пространство имен, по существу. Один модуль может содержать много классов, переменных и функций. Метод __del__ расположен на классе, а не на модуле.

-1

Протестировано с использованием 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

Вы отделили вызов 'register', чтобы он был частью класса, но класс еще не существует. Сравните то, что вы сделали с различными примерами в принятом ответе. – DSM

+0

А, ок. Я не понимал, что класс не существует на данный момент. – user2153867

Смежные вопросы