Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么在出现错误后不调用`\u del\u`方法?_Python_Python 3.x_Oop_Dispose_Destroy - Fatal编程技术网

Python 为什么在出现错误后不调用`\u del\u`方法?

Python 为什么在出现错误后不调用`\u del\u`方法?,python,python-3.x,oop,dispose,destroy,Python,Python 3.x,Oop,Dispose,Destroy,我发现python的对象处理模式。 我找到了一些模式并编写了这个测试代码 类测试: 定义初始化(self,*args,**kwargs): 打印(“test.uuu init_uuu(self,*args={},**kwargs={})”。格式(args,kwargs)) 定义输入(self,*args,**kwargs): 打印(“测试.uuu输入(self,*args={},**kwargs={})”。格式(args,kwargs)) 定义退出(自我,*args,**kwargs): 打印(

我发现python的对象处理模式。
我找到了一些模式并编写了这个测试代码

类测试:
定义初始化(self,*args,**kwargs):
打印(“test.uuu init_uuu(self,*args={},**kwargs={})”。格式(args,kwargs))
定义输入(self,*args,**kwargs):
打印(“测试.uuu输入(self,*args={},**kwargs={})”。格式(args,kwargs))
定义退出(自我,*args,**kwargs):
打印(“test.\uuuuuuuuuu退出(self,*args={},**kwargs={})”。格式(args,kwargs))
定义(self,*args,**kwargs):
打印(“test.uu del_uu(self,*args={},**kwargs={})”。格式(args,kwargs))
def示例(self、*args、**kwargs):
打印(“test.example(self,*args={},**kwargs={}.”格式(args,kwargs))
如果(kwargs中的“错误”):
引发异常(kwargs[“错误”])
我尝试了这个真正的调用
\uu del\uu
方法

t=test()
t、 示例(1、2、3,message=“test”)
t=无
结果

test.__init__(self, *args=(), **kwargs={})
test.example(self, *args=(1, 2, 3), **kwargs={'message': 'test'})
test.__del__(self, *args=(), **kwargs={}) ## Ok. I can see calling __del__ method
test.__init__(self, *args=(), **kwargs={})
t.example(1, 2, 3, error="some error")
test.example(self, *args=(1, 2, 3), **kwargs={'error': 'some error'}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 13, in example
Exception: some error
t = None
# Opss ! Not calling __del__ method
但此测试后不调用
\uuu del\uuu

t=test()
t、 示例(1、2、3,error=“some error”)
t=无
结果

test.__init__(self, *args=(), **kwargs={})
test.example(self, *args=(1, 2, 3), **kwargs={'message': 'test'})
test.__del__(self, *args=(), **kwargs={}) ## Ok. I can see calling __del__ method
test.__init__(self, *args=(), **kwargs={})
t.example(1, 2, 3, error="some error")
test.example(self, *args=(1, 2, 3), **kwargs={'error': 'some error'}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 13, in example
Exception: some error
t = None
# Opss ! Not calling __del__ method
test.uuu初始化(self,*args=(),**kwargs={})
t、 示例(1、2、3,error=“some error”)
示例(self,*args=(1,2,3),**kwargs={'error':'someerror'}
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第13行,在示例中
例外:一些错误
t=无
#Opss!不调用_del__方法
如果在未调用
\uuuu del\uuuu

为什么?

.del仅在类在销毁对象时完成其进程时调用。每当发生错误时,它都不会完成运行。是的。异常是可能无法调用
\uu del\uu
的原因之一。中甚至提到了这一点"引用循环可以防止对象的引用计数变为零。在这种情况下,循环垃圾回收器稍后将检测并删除该循环。引用循环的常见原因是在局部变量中捕获异常。然后帧的局部变量引用异常,该异常引用它有自己的回溯,它引用在回溯中捕获的所有帧的局部变量。"你是在一个shell中运行这个吗?@juan.arrivillaga我想shell在
sys中保存了这个对象。上次回溯
。我将调用包装在一个try/except块中,然后
\uu del\uu
再次开始工作。然后我在except块中重新加载,并且
\uu del\uuu
再次停止。不幸的是,
sys.last\u traceback=None
没有无法修复它。但是,
\uuu del\uuu
在代码作为脚本运行时确实有效。del仅在类在销毁对象时完成其进程时调用。每当出现错误时,它都不会完成运行。是的。异常是可能无法调用
\uu del\uu
的原因之一。这甚至在"引用循环可以防止对象的引用计数变为零。在这种情况下,循环垃圾回收器稍后将检测并删除该循环。引用循环的常见原因是在局部变量中捕获异常。然后帧的局部变量引用异常,该异常引用它有自己的回溯,它引用在回溯中捕获的所有帧的局部变量。"你是在一个shell中运行这个吗?@juan.arrivillaga我想shell在
sys中保存了这个对象。上次回溯
。我将调用包装在一个try/except块中,然后
\uu del\uu
再次开始工作。然后我在except块中重新加载,并且
\uu del\uuu
再次停止。不幸的是,
sys.last\u traceback=None
没有无法修复。但是,当代码作为脚本运行时,
\uu del\uu
确实起作用。