[Python-de] Referenzzähler austricksen?

Walter Haslbeck news at badblocks.de
Don Jan 29 12:23:38 CET 2004


Hallo,

folgendes Problem:

Ich habe ein Klasse, deren Objekte in einer sortierten Liste gehalten
werden. Die Liste ist in der Basisklasse als Klassenattribut definiert.

Wenn ich nun ein instanziertes Objekt dieser Klasse mit 'del' lösche,
wird der Destruktor (darin würde ich gerne die Objektreferenz aus der
Liste löschen) nicht aufgerufen, da ja in Liste noch eine Referenz
auf dieses Objekt besteht.

Als Workaround hab ich eine Methode 'remove' erstellt, die erst das
Objekt aus der Liste entfernt. Anschliessend kann ich mit del das
Objekt löschen. Das gefällt mir garnicht...

Gibt es eine Möglichkeit, eine Referenz auf eine Objekt in der
Liste abzulegen, ohne den Python-internen Objekt-Referenzzähler
zu berühren?

(Sorry, falls das eine FAQ ist, aber ich bin absoluter Python Newbie)


################################################################################
class GOb:

    __olist=[]

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

    def __c_add__(gob):
	GOb.__olist.append(gob)
	GOb.__olist.sort()

    def __c_remove__(gob):
	GOb.__olist.remove(gob)

    c_show_all=staticmethod(c_show_all)
    __c_add_=staticmethod(__c_add__)
    __c_remove_=staticmethod(__c_remove__)

    def __init__(self, name="GOB", priority=0):
	self.priority=priority
	self.name=name
	GOb.__c_add__(self)

#   WORKAROUND?
    def remove(self):
	GOb.__c_remove__(self)

#    SO GEHTS NICHT
#    def __del__(self):
#	print "destruktor called fuer " + self.name
#	GOb.__c_remove__(self)

    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)
    
    print "--- ALLE ---"
    GOb.c_show_all()
    
    print "--- DELETED SOME ---"
    a.remove()
    del a
    GOb.c_show_all()
################################################################################

Walter