如何知道Python中是否删除了对象

时间:2012-07-04 11:29:20

标签: python pyside

我在堆中有一个对象并且引用它。在某些情况下,对象会被删除,但指向其位置的引用不知道这一点。如何检查堆中是否有真实数据?

例如:

from PySide import *
a = QProgressBar()
b = QProgressBar()
self.setIndexWidget(index,a)
self.setIndexWidget(index,b)

然后a对象被删除,但print(a)返回有效地址。但是,如果您尝试a.value() - 发生运行时错误(C ++对象已被删除)。

a is None返回False

3 个答案:

答案 0 :(得分:9)

对于PySide个对象,您需要shiboken模块来执行对象查询。

访问shiboken module documention

import shiboken

print shiboken.isValid(a)

答案 1 :(得分:3)

使用sip模块,详细了解sip here

import sip

a = QProgressBar()
sip.isdeleted(a)
False

sip.delete(a)
a
<PyQt4.QtCore.QObject object at 0x017CCA98>

sip.isdeleted(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: underlying C/C++ object has been deleted

答案 2 :(得分:1)

当对象负责删除另一个对象时,文档中明确提到了它。在您的示例中,您可以在Qt doc

中看到这一点
  

如果索引窗口小部件A被索引窗口小部件B替换,索引窗口小部件A将被删除。