[Python-de] Re: Referenzzähler austricksen?

Walter Haslbeck news at badblocks.de
Don Jan 29 17:54:38 CET 2004


Stefan Fleiter <stefan.fleiter at web.de> wrote:

> Hilft dir das Modul weakref?

OK, nun hab ich mein Problem mit weakref. Erstmal der Code:

################################################################################

import weakref

class GOb:

    __olist=[]

    def c_show_all():
	for i in GOb.__olist:
	    i.show()

    def proxy_callback(x):
	print "callback"
	GOb.__olist.remove(x)

    proxy_callback=staticmethod(proxy_callback)
    c_show_all=staticmethod(c_show_all)

    def __init__(self, name="GOB", priority=0):
	self.priority=priority
	self.name=name
	ref=weakref.proxy(self, GOb.proxy_callback)
	GOb.__olist.append(ref)
	GOb.__olist.sort()
    
    def __del__(self):
	print "Destruktor called for GOB " + self.name

    def show(self):
	print self.name + " " + str(self.priority)

    def __cmp__(self, other):
	if self.priority < other.priority:
	    return -1
	elif self.priority == other.priority:
	    return 0
	else:
	    return 1

if __name__ == '__main__':

    a=GOb("T1", 0)
    b=GOb("T2", 2)
    c=GOb("T3", 1)
    
    GOb.c_show_all()
    del a
    GOb.c_show_all()

################################################################################

So klappts leider nicht, denn: Wenn der callback des Proxy-Objektes aufgerufen
wird, ist das Objekt schon nicht mehr existent und der Destruktor des Objektes
wird noch später aufgerufen:

$ python ex.py
1 0
T3 1
T2 2
callback
Exception exceptions.ReferenceError: 'weakly-referenced object no longer exists' in <function proxy_callback at 0x403c5fb4> ignored
Destruktor called for GOB T1
[...]


Die Doku sagt: ... 'callback', if given, is called with a reference to
                    the proxy when it is about to be finalized...

Hm, 'about to' übersetze ich mich 'kurz bevor', also sollte ja zu der
Zeit, in der der callback stattfindet das Objekt noch existieren, oder?

Wie krieg ich das Objekt wieder aus meiner __olist[]?

Walter