Instanz einer Klasse dynamisch erzeugen

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
smith0815
User
Beiträge: 99
Registriert: Dienstag 13. April 2010, 11:08

Hi

Ich habe ein kleines Problem und hoffe Ihr könnt mir helfen.

Ich habe eine List mit Klassennamen, wobei ein Name nach bestimmten Bedingungen ausgesucht und dann eine Instanz dieser Klasse erzeugt werden soll.
Funktioniert das in Python eigentlich und wenn ja wie?
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Klar geht das:

Code: Alles auswählen

>>> class A(object): pass
>>> class B(object): pass
>>> class C(object): pass

>>> alist = [A, B, C]
>>> def find_by_name(alist, name):
        for cls in alist:
            if cls.__name__ == name:
                return cls

>>> find_by_name(alist, "A")
<class '__main__.A'>
Oder wenn du nur die Namen hast, dann kannst du auch "getattr(modul, classname)" verwenden.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
BlackJack

Statt linear in einer Liste zu suchen, könnte man sich auch ein Wörterbuch anlegen, das Namen auf Klassenobjekte abbildet.
smith0815
User
Beiträge: 99
Registriert: Dienstag 13. April 2010, 11:08

mein Problem ist, dass ich die Anzahl der benötigten Instanzen nicht im Vorherein kenne.

Daher versuche ich es mal mit getattr(modul, klasse)

Danke
lunar

@smith0815: Ein bisschen Hintergrund-Informationen darüber, was genau Du erreichen möchtest, wären sinnvoll.
smith0815
User
Beiträge: 99
Registriert: Dienstag 13. April 2010, 11:08

ich habe eine Liste von Klassennamen

classnames("class1", "class2", "class3", usw.)

jenach dem wie die entsprechende Bedingung lautet, sollen halt 2 Objekte von Ersten, 4 vom Zweiten, usw. erzeugt werden.

Diese werden dann später entsprechend der Bedingung zusammen gefügt und da ich die genaue Menge der einzelnen benötigten Objekte nicht kenne wollte ich sie dynamisch erzeugen.

ich kann natürlich auch eine Funktion schreiben, aber ich dachte es geht wie so oft auch viel einfacher.
lunar

Wenn Du eine feste Liste von Klassennamen hast, dann kannst Du daraus auch ebenso gut eine Abbildung von Klassennamen zu den zugeordneten Klassen in Form eines Wörterbuchs erzeugen. Wie viele Exemplare einer einzelnen Klasse man dann nachher erzeugt, ist davon ja völlig unabhängig, wo also ist das Problem?
smith0815
User
Beiträge: 99
Registriert: Dienstag 13. April 2010, 11:08

das Problem liegt in meiner etwas geringen Erfahrung mit Python
Daher sind da einige Lücken im Wissen.

PS: wie sieht den der Code dafür aus???
lunar

Code: Alles auswählen

class Spam(object):
    pass

class Eggs(object:
    pass

name2class = {'spam': Spam, 'eggs': Eggs}

spam = name2class['spam']()
eggs = [name2class['eggs']() for _ in xrange(10)]
smith0815
User
Beiträge: 99
Registriert: Dienstag 13. April 2010, 11:08

ach ich Depp klar :oops:

Dank dir
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Die Klasse sollte wohl besser "Egg" heißen, dann ergibt der Name "eggs" als Liste von "Egg"-Exemplaren auch mehr Sinn. Naja, waren ja nur Beispielnamen, aber: trotzdem :P.
Antworten