这是weakref的一个很好的用例吗?

时间:2014-06-12 16:30:44

标签: python weak-references

我已经阅读了this post关于python中循环引用的内容,但我不是百分之百地认为weakref是否适用于我的情况。

所以我就是这样。

我为文件版本编写了一个框架。我有一个File类,我操作它以获得有关本地修订和服务器修订的信息。

它看起来像这样(我有意颠倒了类声明):

class File(object):
    def __init__(self, path):
        self.path = path
        self.db_object = db_query_file(path)
        self.local = _LocalVersion(self)
        self.latest = _LatestVersion(self)

class _Version(object):
    def __init__(self, file):
       self.file = file

    def size(): pass
    def checksum(): pass

class _LocalVersion(Version):
    def __init__(self, file):
        super(_LocalVersion, self).__init__(file)
        self.info = get_info_from_local(file.path)

    def size(): return local_size(self.file.path)
    def checksum(): return local_checksum(self.file.path)

class _LatestVersion(Version):
    def __init__(self, file):
        super(_LatestVersion, self).__init__(file)
        self.info = query_latest_info_from_db(file.db_object)

    def size(): return self.info.size
    def checksum(): return self.info.checksum

现在我怀疑我的File个对象都不会被垃圾收集,因为它们的内部器官被引用,因此将始终具有正的引用计数。

当必须删除_Version实例时,File的实例没有任何目的。

_Version定义为:

是否安全且相关
class _Version(object):
    def __init__(self, file):
        self.file = weakref.proxy(file)

感谢您的评论,更正和想法!

干杯 O操作。

1 个答案:

答案 0 :(得分:3)

  

现在我怀疑看到我的File个对象都不会被垃圾收集,因为它们被内部器官引用,因此总是会有正数。

CPython不时运行garbage collector来打破循环引用。您的对象收集,但速度稍慢。

  

将_Version定义为:

是否安全且相关
class _Version(object):
    def __init__(self, file):
        self.file = weakref.proxy(file)

这是非常安全的,是的。除非您正在运行一个长时间运行的进程并且计划一次释放大量File个实例,否则它可能会过度。如果存在大量循环引用,则如果定期遗留大量孤立的循环引用,则垃圾收集器可能会影响整体性能。