我有一个代表数据库连接的类,它有一个close
方法。为了使它更舒适,类本身就是一个上下文管理器,它在完成连接后关闭连接。
问题是我不能保证这个类的用户总是记得使用上下文管理器或者明确地关闭它,所以我想实现一个在对象被垃圾回收时调用的方法。 / p>
__del__
方法看起来非常像我需要的东西,但我在很多地方都读到它有风险,因为它会干扰垃圾收集器,特别是如果有一些循环引用。
这是真的吗?下面的代码会引起一些潜在的内存泄漏吗?
def __del__(self):
self.close()
答案 0 :(得分:1)
以下是您需要weakref的示例,以便孩子不会阻止父母进行清理:
import weakref
class Spam(object):
def __init__(self, name):
self.name = name
def __del__(self):
print '%r got deleted' % self
def __repr__(self):
return '<%s:%s>' % (self.__class__.__name__, self.name)
class SpamChild(Spam):
def __init__(self, name, parent):
Spam.__init__(self, name)
self.parent = weakref.ref(parent)
def __del__(self):
print '%r, child of %r got deleted' % (self, self.parent)
a = Spam('a')
b = SpamChild('b', a)
del a