10

有没有一种方法可以添加到我的模块中,在破坏类时会被调用?

我们有一个简单的类,它只有静态成员函数,卸载模块时需要清理数据库连接。

希望对于__del__没有实例的模块或类有一种方法吗?

4

4 回答 4

21

什么时候销毁哪个类?我虽然你说模块?

您的模块一直存在,直到解释器停止。您可以使用“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并避免创建自己的数据库接口的所有这些麻烦。

于 2009-06-03T12:05:17.497 回答
1

您正在寻找的类析构函数方法是__del__. 调用的时间以及如何处理异常和子类化有一些细微差别__del__,因此请务必阅读官方文档

关于术语的快速说明:在 python 中,amodule是您的代码所在的文件......本质上是一个命名空间。一个模块可以包含许多类、变量和函数。该__del__方法位于类上,而不是模块上。

于 2009-06-03T12:05:17.153 回答
-1

使用 del 方法:

class Foo:

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

    def __del__(self):
        print "destructor called."
于 2009-06-03T12:04:26.610 回答
-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
于 2013-03-10T13:30:32.897 回答