Erweiterung zu __subclasses__: __instances__
Verfasst: Montag 24. November 2008, 01:14
Ich suchte eine Möglichkeit mir die Instanzen einer Klasse auflisten zu lassen. Da man __del__ ja nicht verwenden kann, erschien das kompliziert, da die Objekte allein durch ihre Präsenz in der Liste niemals gelöscht werden würden. __del__ kann / sollte man ja nicht verwenden. Lösung:
Verwendung ist aquivalent zu __subclasses__. Ich kann mir vorstellen, das mancher das gebrauchen kann. Über das weakref Modul findet man hier sowieso noch wenig, schaden kanns also nicht
.
Anmerkung: Nicht in ipython ausprobieren, wahrscheinlich hält ipython selbst noch Referenzen auf das Objekt wenn es gelöscht wird. Zb über _. Ich hatte das Problem, bis ichs im normalen Python Interpreter getestet habe.
Ich glaube, ich werde das aber nicht "produktiv" verwenden und werde das eigentliche Problem anders angehen. Der Weg erscheint mir suboptimal (nicht die Implementation, generell sich Instanzen von einer Klasse zu holen, ist der Funktionsweise eines Singletons irgendwie ähnlich - und mir kommen mit einem Male Zweifel, ob das Konzept nicht unsicher ist, und zwar aus denselben Gründen wie bei __del__..)
Code: Alles auswählen
import weakref
class Cls(object):
_instances = []
def __init__(self):
self._instances.append(weakref.ref(self, self._del_weakref))
@classmethod
def __instances__(cls):
return [inst() for inst in cls._instances if inst() is not None]
@classmethod
def _del_weakref(cls, weak_ref):
del cls._instances[cls._instances.index(weak_ref)], weak_ref

Anmerkung: Nicht in ipython ausprobieren, wahrscheinlich hält ipython selbst noch Referenzen auf das Objekt wenn es gelöscht wird. Zb über _. Ich hatte das Problem, bis ichs im normalen Python Interpreter getestet habe.
Ich glaube, ich werde das aber nicht "produktiv" verwenden und werde das eigentliche Problem anders angehen. Der Weg erscheint mir suboptimal (nicht die Implementation, generell sich Instanzen von einer Klasse zu holen, ist der Funktionsweise eines Singletons irgendwie ähnlich - und mir kommen mit einem Male Zweifel, ob das Konzept nicht unsicher ist, und zwar aus denselben Gründen wie bei __del__..)