Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python以内存安全的方式使用析构函数_Python_Memory Management_Destructor - Fatal编程技术网

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

Python以内存安全的方式使用析构函数,python,memory-management,destructor,Python,Memory Management,Destructor,我有一个表示数据库连接的类,它有一个close方法。为了让它使用起来更舒适,类本身是一个上下文管理器,在使用完它后关闭连接 问题是,我无法保证此类的用户将始终记住使用上下文管理器或显式关闭它,因此我希望实现一个在垃圾收集对象时调用的方法 \uuu del\uu方法看起来非常像我需要的,但是我在很多地方都读到过,这是有风险的,因为它会干扰垃圾收集器,特别是在存在一些循环引用的情况下 这有多真实?以下代码是否会导致一些潜在的内存泄漏 def __del__(self): self.close

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

问题是,我无法保证此类的用户将始终记住使用上下文管理器或显式关闭它,因此我希望实现一个在垃圾收集对象时调用的方法

\uuu del\uu
方法看起来非常像我需要的,但是我在很多地方都读到过,这是有风险的,因为它会干扰垃圾收集器,特别是在存在一些循环引用的情况下

这有多真实?以下代码是否会导致一些潜在的内存泄漏

def __del__(self):
    self.close()

下面是一个示例,您需要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
导入weakref
类垃圾邮件(对象):
定义初始化(self,name):
self.name=名称
定义(自我):
打印“%r”已被删除“%self”
定义报告(自我):
返回“”%(self.\u类\u.\u名称\u,self.name)
SpamChild类(垃圾邮件):
定义初始化(自我、姓名、父项):
垃圾邮件。\uuuu init\uuuuuu(self,name)
self.parent=weakref.ref(父级)
定义(自我):
打印“%r,已删除%r的子项“%”(self,self.parent)
a=垃圾邮件('a')
b=SpamChild('b',a)
德拉

请参阅相关内容:为了确保这些类型的问题不会导致内存泄漏,您可以使用weakref:@EdChum谢谢,但它们不提供任何上下文管理器提供的内容。@Wolph我读过关于weakrefs的内容,但我不知道如何在我的代码中实现它。我很乐意读一份关于这方面的建议。谢谢