【发布时间】:2009-09-01 22:16:52
【问题描述】:
问题基本上是这样的,在 python 的 gobject 和 gtk 绑定中。假设我们有一个在构造时绑定到信号的类:
class ClipboardMonitor (object):
def __init__(self):
clip = gtk.clipboard_get(gtk.gdk.SELECTION_CLIPBOARD)
clip.connect("owner-change", self._clipboard_changed)
现在的问题是,ClipboardMonitor 的任何实例都不会死。 gtk 剪贴板是一个应用程序范围的对象,连接到它会保留对该对象的引用,因为我们使用回调 self._clipboard_changed。
我正在讨论如何使用弱引用(weakref 模块)来解决这个问题,但我还没有想出一个计划。任何人都知道如何将回调传递给信号注册,并使其表现得像一个弱引用(如果在 ClipboardMonitor 实例超出范围时调用信号回调,则它应该是空操作)。
补充:独立于 GObject 或 GTK+:
如何为不透明对象提供回调方法,使用弱引用语义?如果连接对象超出范围,则应将其删除并且回调应充当空操作;连接者不应持有对连接器的引用。
澄清一下:我明确希望避免调用“析构函数/终结器”方法
【问题讨论】:
-
附加想法:如果你不需要断开连接,一个“有点”骇人听闻的想法:clip.connect("foo", (lambda *things,obj=weakref.ref(self):(obj ().method(*things) if obj() else None))) -- 不是很好,但是单行!