我很抱歉未提供示例代码。但是我无法在自己的代码之外复制它。
i具有对话对象( wx.Dialog
),该对象具有sqlalchemy-mapped对象的 list
。
对话框关闭并销毁正确。我用调试代码,id()
和__del__()
。
但是,当我再次打开对话框(在主窗口中按下相关按钮)时,SQLalchemy映射对象的相同实例仍在list
中。对话框对象是RAM中的新事物,但其数据对象的列表与第一个对话框实例相同。我很困惑。
目前,我在对话框的__del__()
中调用self._datalist.clear()
。然后它起作用。
但我不确定为什么会发生这种情况,如果我的解决方案优雅?
在python中,您不会"删除"使它们消失的东西,而且您几乎永远不想将__del__()
用于大部分内容;Python是一种收集的垃圾语言,您只是"忘记"对象,它们最终将被释放。
您最有可能遇到的问题是,尽管您自己的代码忘记了对象本身,但您从您检索到的sqlalchemy session()
对象并没有忘记它们。实际上,这是session
的确切内容,当从具有相同主要钥匙值的数据库中检索两个行时,它们成为Python中的相同对象。
您很可能想在工作单元之间处置整个会话(例如,以"保存"结尾的用户交互)。为此,您可以使用session.close()
。之后,您可以继续使用会话;需要在需要时开始新的交易,或以相同的方式获得新的会话。
如果您确实需要管理每个对象的对象寿命,则可以使用session.expunge()
,但是只有当您对会话真正为您所做的事情有很好的了解时,只有这样做。一个很好的起点是文档中的State Management
章节: