ich so etwas wie dies heute (nicht im Gegensatz zu der mpl_connect Dokumentation schrieb:Wenn ich einen Verweis auf eine gebundene Methode in Python habe, wird das das Objekt allein am Leben erhalten?
class Foo(object):
def __init__(self): print 'init Foo', self
def __del__(self): print 'del Foo', self
def callback(self, event=None): print 'Foo.callback', self, event
from pylab import *
fig = figure()
plot(randn(10))
cid = fig.canvas.mpl_connect('button_press_event', Foo().callback)
show()
Das sieht vernünftig, aber es funktioniert nicht - es ist, als ob matplotlib Spur der Funktion verliert ich ihm gegeben habe If. ., statt sie zu vorbei Foo().callback
ich es passieren lambda e: Foo().callback(e)
, es funktioniert ähnlich, wenn ich sage x = Foo()
und es dann x.callback
passieren, es funktioniert
Meine Vermutung ist, dass die unbenannte Foo Instanz von Foo()
erstellt unmittelbar nach der mpl_connect
Linie zerstört wird. - - dass Matplotlib diehatReferenz hält die Foo
nicht am Leben. Ist das korrekt?
Im Nicht-Spielzeug Code, den ich dies in angetroffen hat die Lösung von x = Foo()
nicht, weil vermutlich in diesem Fall show()
war anderswo so hatte x
den Gültigkeitsbereich gegangen.
Allgemeiner ist Foo().callback
ein <bound method Foo.callback of <__main__.Foo object at 0x03B37890>>
. Meine erste Überraschung ist, dass es so aussieht, als ob eine gebundene Methode nicht wirklich auf das Objekt verweist. Ist das korrekt?
Wird "del Foo" jemals gedruckt? –