通过“ del module_x”销毁实例

问题描述

| 我创建了自己的模块\“ MyServer \”,其功能为\“。connect()\”。 连接到服务器后
import MyServer
con = MyServer.connect(...)
并且我删除了我的模块(\“ del MyServer \”),我希望\“ con \”也能立即删除/销毁。 但这是行不通的。也许原因是垃圾收集器。但是我怎么能说“立即删除!” :)     

解决方法

        我假设您正在尝试确保与服务器的连接已关闭?这不是正确的方法。有几种选择: 编写一个“ 1”方法并使用:
try: 
    con = MyServer.connect()
finally:
     MyServer.disconnect_all()
编写一个“ 3”方法并使用:
con = MyServer.connect()
try:
    ...
finally:
    con.close()
将闭合逻辑放在
con
对象的
__del__
方法中:
class Connection:
    ...
    def __del__(self):
        # do closing things
完成连接后,请执行
del con
。请注意,这可能不是最佳选择,因为
del con
实际上并未删除
con
对象,它只是将其引用计数减一。如果仍然保留其他任何内容,则不会将其删除。 (最佳选择。)将
Connection
用作上下文管理器,可能使用
contextlib.contextmanager
进行帮助。然后,您可以执行以下操作:
with con as Connection(...):
    ...
并在离开“ 14”块时使用您的关闭逻辑自动关闭连接(即使在例外情况下)。 如果您对删除模块对象为什么不删除连接感兴趣,我建议您研究一下基于引用计数的Python内存管理。每当您创建对一个对象的引用时,该对象上的计数器就会增加一个,并且每当删除引用时(例如,使用
del
,超出范围,...),计数器就会减少一。每当此计数器达到零时,都会删除该对象。 在您的情况下,您建立
con
连接。这是对连接对象的引用,因此它具有非零的引用计数。当您删除模块时,这可能会或可能不会减少连接对象的引用计数,但不会将其减少为零-因为ѭ6still仍然是引用,并且您尚未删除! 我认为您应该尝试显式而不是隐式地编写连接的关闭逻辑。     ,        如果在执行
del
之后碰巧不再有对该对象的引用,则该对象可能立即被释放,或者稍后再进行垃圾回收,那么该对象可能会被销毁,但这是偶然的:
del
仅删除了对对象的引用,它不会不会直接删除任何对象。一个模块将在整个系统中具有许多其他参考。 如果要关闭连接,则应明确执行此操作,否则连接本身将成为阻止模块删除的众多措施之一。在实践中,您必须非常努力地删除模块,因此通常不值得尝试。