Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.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 这是weakref的一个好用例吗?_Python_Weak References - Fatal编程技术网

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

Python 这是weakref的一个好用例吗?,python,weak-references,Python,Weak References,我已经读过python中的循环引用,但我对weakref在我的例子中是否是正确的选择并不是100% 我就在这里 我编写了一个文件版本化框架。我有一个文件类,我操纵它来获取有关本地版本和服务器版本的信息 看起来是这样的(我故意颠倒了类声明): 现在我怀疑我的文件对象都不会被垃圾收集,因为它们被内部器官引用,因此引用计数总是为正 当然,当必须删除文件实例时,\u版本的实例没有存在的目的 将\u版本定义为: class _Version(object): def __init__(self,

我已经读过python中的循环引用,但我对weakref在我的例子中是否是正确的选择并不是100%

我就在这里

我编写了一个文件版本化框架。我有一个
文件
类,我操纵它来获取有关本地版本和服务器版本的信息

看起来是这样的(我故意颠倒了类声明):

现在我怀疑我的
文件
对象都不会被垃圾收集,因为它们被内部器官引用,因此引用计数总是为正

当然,当必须删除
文件
实例时,
\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
模块测量该值,以满足您的特定用途。不过会很快;a
weakref.proxy()
在C代码中完成所有工作,Python类型对弱引用有特殊规定。感谢@martijn pietersGlad的帮助!
class _Version(object):
    def __init__(self, file):
        self.file = weakref.proxy(file)