python 析构函数无法被正确调用的有关问题
python 析构函数无法被正确调用的问题
输出结果是
init B
init A
del B
del A
构造函数没有执行完,却调用了析构函数,如果有些析构函数中去释放没有获得的资源肯定会出问题
输出结果是
init
当一个类中有线程在运行时,析构函数也无法被调用
------解决方案--------------------
c = None只是减少对象的引用计数,既然有个线程参考这个对象自然是不会调用__del__,再者你用deamon线程那就是在等整个程序退出,调不调用__del__也没所谓了。所以你如果要测试析构的效果,线程不要是daemon,类似:
class A:
def __init__(self):
print "init A"
def __del__(self):
print "del A"
class B:
def __init__(self):
print "init B"
self._a = A()
raise Exception
def __del__(self):
print "del B"
b = B()
输出结果是
init B
init A
del B
del A
构造函数没有执行完,却调用了析构函数,如果有些析构函数中去释放没有获得的资源肯定会出问题
import time
from threading import Thread
class C:
def __init__(self):
print "init"
self._thread = Thread(target=self._run)
self._thread.daemon = True
self._thread.start()
def __del__(self):
print "del"
def _run(self):
time.sleep(1000)
c = C()
c = None
输出结果是
init
当一个类中有线程在运行时,析构函数也无法被调用
------解决方案--------------------
c = None只是减少对象的引用计数,既然有个线程参考这个对象自然是不会调用__del__,再者你用deamon线程那就是在等整个程序退出,调不调用__del__也没所谓了。所以你如果要测试析构的效果,线程不要是daemon,类似:
import time
from threading import Thread
class C:
def __init__(self):
print "init"
self._thread = Thread(target=self._run)
#~ self._thread.daemon = True
self._thread.start()