Le problème est fondamentalement ceci, dans les liaisons gobject et gtk de python. Supposons que nous avons une classe qui se lie à un signal lorsque construit:Comment se connecter à un signal GObject en python, sans garder une référence au connecteur?
class ClipboardMonitor (object):
def __init__(self):
clip = gtk.clipboard_get(gtk.gdk.SELECTION_CLIPBOARD)
clip.connect("owner-change", self._clipboard_changed)
Le problème est maintenant que, aucun cas de ClipboardMonitor va jamais mourir. Le presse-papier gtk est un objet à l'échelle de l'application, et la connexion à celui-ci conserve une référence à l'objet, puisque nous utilisons le rappel self._clipboard_changed
.
Je discute de la façon de contourner ce problème en utilisant des références faibles (module weakref), mais je n'ai pas encore trouvé de plan. Tout le monde a une idée de comment passer un rappel à l'enregistrement du signal, et se comporter comme une référence faible (si le rappel de signal est appelé quand l'instance de ClipboardMonitor est hors de portée, cela devrait être un non-op).
Addition: Formulé indépendamment de GObject ou GTK +:
Comment fournissez-vous une méthode de rappel à un objet opaque, avec la sémantique weakref? Si l'objet de connexion est hors de portée, il devrait être supprimé et le rappel devrait agir comme un no-op; le connecté ne doit pas contenir de référence au connecteur.
Pour clarifier: Je veux explicitement éviter d'avoir à appeler une méthode « destructor/finaliseur »
idée supplémentaire: si vous n'avez pas besoin de débrancher, un "légèrement" idée hackish: clip.connect ("foo", (lambda * les choses, obj = weakref.ref (self) :(obj(). method (* choses) si obj() else Aucune))) - pas très sympa, mais un one-liner! – liori