代码之家  ›  专栏  ›  技术社区  ›  Eli Bendersky

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

  •  6
  • Eli Bendersky  · 技术社区  · 17 年前

    close

    我正在考虑使用 __del__ __德尔__ 正确地

    This discussion 提出了一个类似的问题,但没有找到令人满意的答案。我不想有一个明确的答案 关 方法和使用 with

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

    2 回复  |  直到 9 年前
        1
  •  8
  •   S.Lott    17 年前

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

    __enter__ 和 __exit__ 委员会采用的方法 with

    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()
    

    策略 图案“必须关闭的对象”是一种策略,插入到某个更大的对象中。程序集是在GUI应用程序的顶层创建的,因为这通常是获取数据库等资源的地方。

        2
  •  6
  •   nosklo    17 年前

    您可以创建一个连接模块,因为模块在整个应用程序中保持相同的对象,并注册一个函数以使用 atexit 单元

    # db.py:
    import sqlite3
    import atexit
    
    con = None
    
    def get_connection():
        global con
        if not con:
            con = sqlite3.connect('somedb.sqlite')
        atexit.register(close_connection, con)
        return con
    
    def close_connection(some_con):
        some_con.commit()
        some_con.close()
    
    # your_program.py
    import db
    con = db.get_connection()
    cur = con.cursor()
    cur.execute("SELECT ...")
    

    此建议基于这样的假设:应用程序中的连接看起来像是一个单一实例(单实例),而全局模块可以很好地提供该实例。

    如果不是这样,那么可以使用析构函数。

    此外,你所说的C++是错误的。如果在C++中使用析构函数,则在定义对象的块结束时调用它们(如Python)。 with )或者当你使用 delete new close() 那不是析构函数。所以就像python一样,python甚至“更好”,因为它有一个垃圾收集器。