我有一个文本编辑程序,将游标分发给需要它的程序的其他部分.游标由两部分列表组成,[start, end]每次插入/删除文本时都需要更新(开始/结束索引向前或向后移动).
当光标不再使用时,我想停止更新它,因为它有很多,而且更新时间很长.不使用,我的意思是请求它的对象不再引用它 - 它不再关心它.(例如:它有一个关于'bob'一词的所有搜索结果的游标列表,并且对'fred'这个词进行了新的搜索,所以现在用一个新的游标列表替换它的结果列表. .旧列表及其游标不再使用.)
我可以要求使用游标的任何对象在.finished()不再需要时调用方法.但是,如果我能够检测到编辑器之外的任何内容不再被引用,那将会更容易.我如何在python中检查这个(我知道垃圾清理维护一个列表,并在不再引用时删除它)?
使用弱引用从weakref模块将光标引用.
当弱引用的引用不再具有对它的任何强(正常)引用时,weakref将解析为None.
>>> import weakref
>>> class Cursor: pass
...
>>> _ = None # suppress special _ variable
>>> a = Cursor()
>>> r = weakref.ref(a)
>>> print r()
<__main__.Cursor instance at 0x1004a2bd8>
>>> del a
>>> print r()
None
Run Code Online (Sandbox Code Playgroud)
你可以把所有这些weakrefs集合中(或使用WeakKeyDictionary,WeakValueDictionary或WeakSet),让你有更新的各种光标的轨道.