Python __在程序结束时删除
假设有一个程序在运行时包含几个对象 程序结束时是否调用了每个对象的_udel_uu方法 例如,如果是,我可以这样做:Python __在程序结束时删除,python,Python,假设有一个程序在运行时包含几个对象 程序结束时是否调用了每个对象的_udel_uu方法 例如,如果是,我可以这样做: class Client: __del__( self ): disconnect_from_server() 有许多与使用\uuu del\uuu有关。 通常,没有必要,或者最好自己定义它 相反,如果希望对象在退出或出现异常时自行清理,请使用: 根据卡尔的评论: class Client: def __exit__(self,ext_type,exc_va
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
方法(作为引用周期一部分的对象除外)
尽管如其他人所指出的,方法非常脆弱,应谨慎使用。此外,您可以定义方法来实现同样的目的: