-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi,
Is it normal for the destructor to be called more than once? This code caused it to happen: import gtk class A(gtk.Window): def __init__(self): gtk.Window.__init__(self) self.connect("delete-event", lambda w,e: gtk.main_quit()) def __del__(self): print 'bye', self if __name__ == '__main__': A().show() print 'enter main' gtk.main() print 'quitting' $ python test.py bye <A object at 0x252bc80 (GtkWindow at 0x25bb240)> enter main bye <A object at 0x252bc80 (GtkWindow at 0x25bb240)> quitting $ python --version Python 2.6.4 FYI, gtk.Window is a new-style class. There is another thread about this claiming this is a bug, but the author only mentions it happening with old-style classes: http://mail.python.org/pipermail/python-dev/2006-August/068358.html I don't suspect this is a bug in pygtk, as a grep for __del__ yields nothing through pygtk's and pygobject's sources (pygobject is a heavy dependency of pygtk). Furthermore, pygtk has a test case to ensure __del__ is called after GC (pygtk-2.16.0/tests/test_gdk.py), and pygobject has one that asserts __del__ is only called once (pygobject-2.18.0/tests/test_subtype.py). A snippet from pygobject-2.18.0/tests/test_subtype.py: def testSimpleDecref(self): class CallInDel: def __init__(self, callback): self.callback = callback def __del__(self): if callable(self.callback): self.callback() disposed_calls = [] def on_dispose(): disposed_calls.append(None) gobj = gobject.GObject() gobj.set_data('tmp', CallInDel(on_dispose)) del gobj assert len(disposed_calls) == 1 # <---- !! So either this test case is wrong to assume the destructor can only be called once, or there is a bug in Python? -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.14 (GNU/Linux) iEYEARECAAYFAkvDbt0ACgkQ3PGpByoQpZEQBQCbB1pzcOBHWrB4RUqFLaEbKt1E 9a4AoKENPAwQ99g8Y/DJwJqDSQFPGZQ2 =/CUN -----END PGP SIGNATURE----- -- http://mail.python.org/mailman/listinfo/python-list