Python __在程序结束时删除

Python __在程序结束时删除,python,Python,假设有一个程序在运行时包含几个对象 程序结束时是否调用了每个对象的_udel_uu方法 例如,如果是,我可以这样做: class Client: __del__( self ): disconnect_from_server() 有许多与使用\uuu del\uuu有关。 通常,没有必要,或者最好自己定义它 相反,如果希望对象在退出或出现异常时自行清理,请使用: 根据卡尔的评论: class Client: def __exit__(self,ext_type,exc_va

假设有一个程序在运行时包含几个对象

程序结束时是否调用了每个对象的_udel_uu方法

例如,如果是,我可以这样做:

class Client:
  __del__( self ):
    disconnect_from_server()
有许多与使用
\uuu del\uuu
有关。 通常,没有必要,或者最好自己定义它

相反,如果希望对象在退出或出现异常时自行清理,请使用:

根据卡尔的评论:

class Client:
    def __exit__(self,ext_type,exc_value,traceback):
        self.disconnect_from_server()

with Client() as c:
    ...
import contextlib

class Client:
    ...

@contextlib.contextmanager
def make_client():
    c=Client()
    yield c
    c.disconnect_from_server()

with make_client() as c:
    ...
原始答案:

class Client:
    def __exit__(self,ext_type,exc_value,traceback):
        self.disconnect_from_server()

with Client() as c:
    ...
import contextlib

class Client:
    ...

@contextlib.contextmanager
def make_client():
    c=Client()
    yield c
    c.disconnect_from_server()

with make_client() as c:
    ...
考虑使用使清除显式化。 使用循环引用时,
\uuu del\uu
不被调用:

class Foo:
  def __del__(self):
    self.p = None
    print "deleting foo"

a = Foo()
b = Foo()
a.p = b
b.p = a

什么也不打印。

我支持使用上下文管理器和
with
语句而不是依赖
\uuu del\uuuu
(出于同样的原因,人们更愿意尝试/最终在Java中终结方法,另外一个原因是:在Python中,
\uu del\uuuu
方法的存在会使循环垃圾无法收集)

然而,鉴于目标是"一个在退出或出现异常后自行清理的对象",@~unutbu的实现是不正确的:

如果在
..
部分引发异常,
断开\u与\u服务器的连接\u
不会被调用(因为异常通过
make\u client
传播,在那里未被捕获,因此在等待
收益时终止它)

解决方法很简单:

@contextlib.contextmanager
def make_client():
    c=Client()
    try: yield c
    finally: c.disconnect_from_server()

本质上,
with
语句让您几乎忘记了好的try/finally语句除了使用
contextlib
编写上下文管理器时,记住它是非常重要的!-)

是的,Python解释器在关机时进行清理,包括调用每个对象的
\uuu del\uu
方法(作为引用周期一部分的对象除外)


尽管如其他人所指出的,
方法非常脆弱,应谨慎使用。

此外,您可以定义方法来实现同样的目的: