erzeugte Instanzen einer Klasse ausgeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
r74
User
Beiträge: 14
Registriert: Montag 15. Dezember 2008, 21:34

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
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

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.
Zuletzt geändert von BlackVivi am Sonntag 21. Dezember 2008, 14:31, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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).
Antworten