Wie verbinde ich mich mit einem GObject-Signal in Python, ohne einen Verweis auf den Konnektor zu behalten?

Das Problem ist im Grunde das, in Pythons Gobject- und Gtk-Bindungen. Angenommen, wir haben eine Klasse, die beim Aufbau an ein Signal gebunden wird:

class ClipboardMonitor (object):
  def __init__(self):
    clip = gtk.clipboard_get(gtk.gdk.SELECTION_CLIPBOARD)
    clip.connect("owner-change", self._clipboard_changed)

Das Problem ist jetzt, dassKeine Instanz von ClipboardMonitor wird jemals sterben. Die gtk-Zwischenablage ist ein anwendungsweites Objekt. Wenn Sie eine Verbindung herstellen, wird ein Verweis auf das Objekt gespeichert, da wir den Rückruf verwendenself._clipboard_changed.

Ich überlege, wie ich das mit schwachen Referenzen umgehen kann (weakref-Modul), aber ich muss noch einen Plan ausarbeiten. Jeder, der eine Idee hat, wie ein Rückruf an die Signalregistrierung übergeben werden soll, und der sich wie eine schwache Referenz verhält (wenn der Signalrückruf aufgerufen wird, wenn die ClipboardMonitor-Instanz außerhalb des Gültigkeitsbereichs liegt, sollte dies ein No-Op sein).

Zusatz:Unabhängig von GObject oder GTK + formuliert:

Wie können Sie einem undurchsichtigen Objekt eine Rückrufmethode mit einer schwachen Referenzsemantik bereitstellen? Wenn das Verbindungsobjekt den Gültigkeitsbereich verlässt, sollte es gelöscht werden und der Rückruf sollte als No-Op fungieren. Der Konnektor sollte keinen Verweis auf den Konnektor haben.

Zur Verdeutlichung: Ich möchte ausdrücklich vermeiden, eine "destructor / finalizer" -Methode aufrufen zu müssen

Antworten auf die Frage(3)

Ihre Antwort auf die Frage