Python以内存安全的方式使用析构函数

时间:2014-03-07 10:16:08

标签: python memory-management destructor

我有一个代表数据库连接的类,它有一个close方法。为了使它更舒适,类本身就是一个上下文管理器,它在完成连接后关闭连接。

问题是我不能保证这个类的用户总是记得使用上下文管理器或者明确地关闭它,所以我想实现一个在对象被垃圾回收时调用的方法。 / p>

__del__方法看起来非常像我需要的东西,但我在很多地方都读到它有风险,因为它会干扰垃圾收集器,特别是如果有一些循环引用。

这是真的吗?下面的代码会引起一些潜在的内存泄漏吗?

def __del__(self):
    self.close()

1 个答案:

答案 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