是否有一种方法可以添加到我的模块中,在破坏类时会调用它?
我们有一个简单的类,它只有静态成员函数,需要在卸载模块时清理数据库连接。
希望对于没有实例的模块或类,会有__del__
方法吗?
答案 0 :(得分:18)
什么时候破坏?我虽然你说模块?
你的模块一直存在,直到翻译停止。你可以使用“atexit”模块添加一些在那时运行的东西:
import atexit
atexit.register(myfunction)
编辑:根据您的意见。
由于您不希望它作为析构函数,我上面的答案是正确的。只需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 :(得分:1)
您正在寻找的类析构函数方法是__del__
。调用时有一些细微差别,以及如何在__del__
中处理异常和子类化,所以请务必阅读official docs。
关于术语的快速说明:在python中,module
是代码所在的文件......实质上是命名空间。单个模块可以包含许多类,变量和函数。 __del__
方法位于类上,而不是模块上。
答案 2 :(得分:-1)
使用del方法:
class Foo:
def __init__(self):
print "constructor called."
def __del__(self):
print "destructor called."
答案 3 :(得分:-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