Проблема в основном в этом, в привязках 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+:
Как вы предоставляете метод обратного вызова непрозрачному объекту с семантикой слабой ссылки? Если подключаемый объект выходит за пределы области видимости, его следует удалить, а обратный вызов должен действовать как отсутствие операции; подключаемый объект не должен содержать ссылку на коннектор.
Чтобы уточнить: я явно хочу избежать вызова метода «деструктор/финализатор».