读书人

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

发布时间: 2013-07-04 11:45:40 作者: rapoo

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



def __del__(self):
print "del"

def _run(self):
#~ time.sleep(1000)
time.sleep(2)

for i in range(10):
c = C()
time.sleep(1)


[解决办法]
前面不是说了线程参考了对象,增加了引用计数,线程若不自动灭掉哪能析构呢,你的想法应该是类似下面,线程不要去参考c对象...

class C:
def __init__(self):
print "init"
self._thread = Thread(target=run)
...

def __del__(self):
print "del"

def run():
...

[解决办法]
c = none 不等于调用析构吧??

读书人网 >perl python

热点推荐