Seite 1 von 1

erzeugte Instanzen einer Klasse ausgeben

Verfasst: Sonntag 21. Dezember 2008, 14:23
von r74
Hallo Forum
Ich mache meine ersten Schritte in Python und im objektorientierten Programmieren.
Eine generelle Frage: Ich erstelle mehrere Instanzen derselben Klasse. Gibt es eine Möglichkeit alle erzeugten Instanzen in einer Schleife durchzugehen ohne z.B. die existierenden Instanzen in einer Liste abzuspeichern?

Code: Alles auswählen

class MyClass(self, p):
    self.prop = p

i1 = MyClass(0)
i2 = MyClass(1)
i3 = MyClass(2)

for instance in Class MyClass:  #<------------
    print instance.prop

Verfasst: Sonntag 21. Dezember 2008, 14:30
von BlackVivi
Mhm, ich weiß das wird wieder so eine "IST DOCH EGAL WAS ICH MACHEN WILL, ICH WILLS EINFACH NUR WISSEN"-Reaktion herausfordern wird...

Ein Programmierkonzept, in dem eine Klasse seine eigenen Instanzen kennen muss... ist doch nicht schön, oder? Also... Hm... mir würde spontan kein Verwendungszweck einfallen.

Naja, was auch immer... es gibt ein paar Möglichkeiten. Aber wie gesagt, überdenk lieber nochmal dein Konzept und so... um herum zu kommen.

Code: Alles auswählen

In [1]: class A: pass

In [4]: foo = A()

In [5]: bar = A()

In [6]: [i for i in globals().values() if isinstance(i, A)]
Out[6]: [<__main__.A instance at 0x00DBA8F0>, <__main__.A instance at 0x00D337D8
>]
Das is nur eine der Möglichkeiten. Aber sie ist wirklich nicht zu empfehlen.

Verfasst: Sonntag 21. Dezember 2008, 14:30
von Leonidas
Ja/Nein. Eigentlich über einige Hacks schon, ist aber eine schlechte Idee. Die Liste ist hingegen eine gute Idee, insbesondere wenn man nummerierte Variablen verwendet, die man durch so eine Liste einfach ersetzen kann.

Und ich meine nicht sowas wie BlackVivi meint, weil das ist nicht nur eine schlechte Idee, es funktioniert auch über Modulgrenzen hinweg nicht.

Verfasst: Sonntag 21. Dezember 2008, 19:14
von Darii
eine Möglichkeit wäre z.B.

Code: Alles auswählen

import gc

class A: pass
a = [A() for dummy in xrange(10)]

for inst in filter(lambda obj: isinstance(obj, A), gc.get_objects()):
    print inst
wobei das weder schnell noch unbedingt zuverlässig ist (kann sein, dass die Instanzen nicht mehr referenziert sind, sondern nur noch darauf warten, gelöscht zu werden). Eine eigens erstellte Liste ist vermutlich zuverlässiger(evtl, als Klassenvariable über __new__, dann aber auf jeden Fall weakref verwenden).