auch wenn ich weiß, dass es Funktionszeiger an sich in Python nicht gibt, ist mir kein besserer Titel eingefallen.
Folgendes Problem (Code-Beispiel im Ende des Postings):
Ich habe eine Klasse, in der eine Member-Variable auf eine Member-Method zeigt (und entsprechend auch auf andere Funktionen zeigen kann). Nun möchte ich eine Instanz dieses Objekts sauber löschen (bzw. entfernen). Dazu verwende ich 'del <Klassen-Objekt>'.
Ich denke der Speicher wird erst dann freigegeben (bzw. 'del' wird erst ausgeführt), wenn der interne Instanzen-Zähler meines Klassenobjects auf 0 heruntergezählt ist. Daher verhindert meine Membervariable auf die Member-Method ein Freigeben des Objekts. Deshalb habe ich am Ende meines Testprogramms eine ganze Reihe von del-Anweisungen, bei denen die verwaisten Objekte freigegeben werden.
Rufe ich nach 'del <Klassenobjekt>' per Hand den Garbage-Collecter 'gc.collect()' auf, werden die Instanzen schon zur Programm-Laufzeit freigegeben, was letzten Endes mein gewünschtes Verhalten wäre.
Gibt es einen Weg dieses Verhalten in sauberen Code in meine Klasse zu implementieren?
Test-Programm (kommentiert man die Zeile 'gc.collect()' aus, so werden die Objekte erst nach Programm-Ende vom Garbagecollector freigegeben):
Code: Alles auswählen
import gc
class a:
def __init__(self, a=0):
self.a = a
self._fkt = self._fkt_a
def print_fkt(self):
self._fkt()
def set_fkt(self, sel: str):
if sel == 'a':
self._fkt = self._fkt_a
elif sel == 'b':
self._fkt= self._fkt_b
def _fkt_a(self):
print("A")
def _fkt_b(self):
print("B")
def __del__(self):
print(f"__del__: self.a={self.a}")
#no super().__del__()?
#super().__del__()
if __name__ == '__main__':
o = a(99)
o.print_fkt()
for i in range(10):
del o
gc.collect()
# Question:
# Is there a clean way to get o deleted 'properly',
# withougt the use of gc?
o = a(i)
o.set_fkt('b')
o.print_fkt()