gpt4 book ai didi

python - 在对象销毁时清理内部 pysqlite 连接

转载 作者:太空狗 更新时间:2023-10-29 22:17:26 26 4
gpt4 key购买 nike

我有一个带有内部数据库连接的对象,该连接在其整个生命周期内都处于事件状态。在程序运行结束时,必须提交并关闭连接。到目前为止,我使用了显式的 close 方法,但这有点麻烦,尤其是当调用代码中可能发生异常时。

我正在考虑使用 __del__ 方法来关闭,但在网上阅读了一些内容后我有顾虑。这是一个有效的使用模式吗?我可以确定内部资源将在 __del__ 中正确释放吗?

This discussion提出了类似的问题,但没有找到满意的答案。我不想有一个明确的 close 方法,并且使用 with 不是一个选项,因为我的对象不像 open-play-close 那样简单地使用,但作为另一个更大对象的成员保留,该对象在 GUI 中运行时使用它。

C++ 具有完美运行的析构函数,可以安全地释放资源,所以我想 Python 也有一些约定俗成的东西。出于某种原因,情况似乎并非如此,社区中的许多人发誓反对 __del__。那还有什么选择呢?

最佳答案

阅读 with陈述。您正在描述它的用例。

您需要将连接包装在“上下文管理器”类中,该类处理 with 使用的 __enter____exit__ 方法声明。

参见 PEP 343获取更多信息。


编辑

“我的对象并没有像打开-播放-关闭那样简单地使用,而是作为另一个更大对象的成员保存”

class AnObjectWhichMustBeClosed( object ):
def __enter__( self ):
# acquire
def __exit__( self, type, value, traceback ):
# release
def open( self, dbConnectionInfo ):
# open the connection, updating the state for __exit__ to handle.

class ALargerObject( object ):
def __init__( self ):
pass
def injectTheObjectThatMustBeClosed( self, anObject ):
self.useThis = anObject

class MyGuiApp( self ):
def run( self ):
# build GUI objects
large = ALargeObject()
with AnObjectWhichMustBeClosed() as x:
large.injectTheObjectThatMustBeClosed( x )
mainLoop()

有些人称之为“依赖注入(inject)”和“控制反转”。其他人称之为Strategy 模式。 “ObjectThatMustBeClosed”是一种策略,插入到一些更大的对象中。该程序集是在 GUI 应用程序的顶层创建的,因为这通常是获取数据库等资源的地方。

关于python - 在对象销毁时清理内部 pysqlite 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/974813/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com