Python中模块删除时调用的方法

12 投票
4 回答
7686 浏览
提问于 2025-04-15 12:01

有没有什么方法可以加到我的模块里,让它在类被销毁的时候自动调用?

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

我希望能有一个 __del__ 方法,适用于没有实例的模块或类,这样就能在它们被销毁时自动执行一些操作。

4 个回答

-1

使用 del 方法:

class Foo:

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

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

你要找的类的析构方法是 __del__。这个方法什么时候被调用,以及在 __del__ 中如何处理异常和子类,有一些细节需要注意,所以一定要看看 官方文档

还有一点关于术语的小提示:在 Python 中,module 指的是存放你代码的文件……本质上就是一个命名空间。一个模块可以包含很多类、变量和函数。__del__ 方法是在类里面,而不是在模块里面。

23

你在问哪个类要被销毁?我以为你说的是模块呢?

你的模块会一直存在,直到解释器停止运行。你可以使用“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,这样就可以避免自己创建数据库接口的麻烦。

撰写回答