我已经阅读了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操作。
答案 0 :(得分:3)
现在我怀疑看到我的
File
个对象都不会被垃圾收集,因为它们被内部器官引用,因此总是会有正数。
CPython不时运行garbage collector来打破循环引用。您的对象将收集,但速度稍慢。
将_Version定义为:
是否安全且相关class _Version(object): def __init__(self, file): self.file = weakref.proxy(file)
这是非常安全的,是的。除非您正在运行一个长时间运行的进程并且计划一次释放大量File
个实例,否则它可能会过度。如果存在大量循环引用,则如果定期遗留大量孤立的循环引用,则垃圾收集器可能会影响整体性能。