Метод, который вызывается при удалении модуля в Python - PullRequest
6 голосов
/ 03 июня 2009

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

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

Надеялся, что будет __del__ метод для модулей или классов, у которых нет экземпляров?

Ответы [ 4 ]

18 голосов
/ 03 июня 2009

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

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

import atexit
atexit.register(myfunction)

РЕДАКТИРОВАТЬ: на основе ваших комментариев.

Поскольку вы не хотите, чтобы он был деструктором, мой ответ выше верен. Просто определите другую функцию (или статический метод, если хотите) и зарегистрируйте ее с помощью 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 голос
/ 03 июня 2009

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

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

0 голосов
/ 10 марта 2013

Проверено с использованием 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 голосов
/ 03 июня 2009

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

class Foo:

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

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