Python 这是weakref的一个好用例吗?
我已经读过python中的循环引用,但我对weakref在我的例子中是否是正确的选择并不是100% 我就在这里 我编写了一个文件版本化框架。我有一个Python 这是weakref的一个好用例吗?,python,weak-references,Python,Weak References,我已经读过python中的循环引用,但我对weakref在我的例子中是否是正确的选择并不是100% 我就在这里 我编写了一个文件版本化框架。我有一个文件类,我操纵它来获取有关本地版本和服务器版本的信息 看起来是这样的(我故意颠倒了类声明): 现在我怀疑我的文件对象都不会被垃圾收集,因为它们被内部器官引用,因此引用计数总是为正 当然,当必须删除文件实例时,\u版本的实例没有存在的目的 将\u版本定义为: class _Version(object): def __init__(self,
文件
类,我操纵它来获取有关本地版本和服务器版本的信息
看起来是这样的(我故意颠倒了类声明):
现在我怀疑我的文件
对象都不会被垃圾收集,因为它们被内部器官引用,因此引用计数总是为正
当然,当必须删除文件
实例时,\u版本
的实例没有存在的目的
将\u版本定义为:
class _Version(object):
def __init__(self, file):
self.file = weakref.proxy(file)
感谢您的评论、更正和想法
干杯
O
现在我怀疑我的文件
对象都不会被垃圾收集,因为它们被它们的内部器官引用,因此总是有一个正的ref计数
CPython不时运行一个循环来中断循环引用。您的对象将被收集,尽管速度稍慢
将_版本定义为:
class _Version(object):
def __init__(self, file):
self.file = weakref.proxy(file)
那会非常安全,是的。除非您正在运行一个长时间运行的流程,并且计划一次发布大量的文件
实例,否则这可能会有点过头。如果存在大量循环引用,如果定期保留大量孤立的循环引用,垃圾收集器可能会影响总体性能。您在类的最新版本(Version)上通过的任何特定原因:
line?@user2357112只是一个输入错误:)我会马上更正它。谢谢你的提示。我不知道那个循环参考断路器。因此,我可能没有必要使用弱引用,因为用户一次使用的对象不超过几千个。你知道使用弱引用对性能的影响吗?@OlivierH:不详细;您可以使用timeit
模块测量该值,以满足您的特定用途。不过会很快;aweakref.proxy()
在C代码中完成所有工作,Python类型对弱引用有特殊规定。感谢@martijn pietersGlad的帮助!
class _Version(object):
def __init__(self, file):
self.file = weakref.proxy(file)