我想问一下如何在Python中删除带有自引用的对象。在
让我们考虑一个类,这是一个简单的示例,可以知道它何时创建和何时删除:
#!/usr/bin/python
class TTest:
def __init__(self):
self.sub_func= None
print 'Created',self
def __del__(self):
self.sub_func= None
print 'Deleted',self
def Print(self):
print 'Print',self
这个类有一个变量self.sub_函数我们假设给它分配一个函数。我想使用一个TTest的实例将一个函数赋给self.sub_函数. 参见以下案例:
^{pr2}$结果是:
Created <__main__.TTest instance at 0x7ffbabceee60>
Print <__main__.TTest instance at 0x7ffbabceee60>
也就是说,虽然我们执行了“del t”,但t没有被删除。在
我想是因为t.sub_func是一个自引用对象,所以t的引用计数器在“del t”处不会变为零,因此垃圾回收器不会删除t。在
为了解决这个问题,我需要插入
t.sub_func= None
在“del t”之前;此时输出为:
Created <__main__.TTest instance at 0x7fab9ece2e60>
Print <__main__.TTest instance at 0x7fab9ece2e60>
Deleted <__main__.TTest instance at 0x7fab9ece2e60>
但这很奇怪。t.sub_func是t的一部分,因此我不想在删除t时清除t.sub_func。在
你能告诉我你是否知道一个好的解决办法吗?在
如何确保引用循环中的对象在无法访问时被删除?最简单的解决方案是不定义
__del__
方法。很少有类需要__del__
方法。Python不保证何时或者甚至是否调用__del__
方法。在有几种方法可以缓解这个问题。在
使用弱引用
创建唯一类
^{pr2}$使用属性
来自the official CPython docs:
另请参见:http://engineering.hearsaysocial.com/2013/06/16/circular-references-in-python/
相关问题 更多 >
编程相关推荐