python 析构函数无法被正确调用的有关问题

python 析构函数无法被正确调用的问题

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()