Python中模块删除时调用的方法
有没有什么方法可以加到我的模块里,让它在类被销毁的时候自动调用?
我们有一个简单的类,里面只有静态成员函数,当卸载模块的时候需要清理数据库连接。
我希望能有一个 __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,这样就可以避免自己创建数据库接口的麻烦。