Seite 1 von 1

Instanz einer Klasse dynamisch erzeugen

Verfasst: Freitag 10. Juni 2011, 09:09
von smith0815
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?

Re: Instanz einer Klasse dynamisch erzeugen

Verfasst: Freitag 10. Juni 2011, 09:22
von Xynon1
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.

Re: Instanz einer Klasse dynamisch erzeugen

Verfasst: Freitag 10. Juni 2011, 09:43
von BlackJack
Statt linear in einer Liste zu suchen, könnte man sich auch ein Wörterbuch anlegen, das Namen auf Klassenobjekte abbildet.

Re: Instanz einer Klasse dynamisch erzeugen

Verfasst: Freitag 10. Juni 2011, 09:47
von smith0815
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

Re: Instanz einer Klasse dynamisch erzeugen

Verfasst: Freitag 10. Juni 2011, 10:31
von lunar
@smith0815: Ein bisschen Hintergrund-Informationen darüber, was genau Du erreichen möchtest, wären sinnvoll.

Re: Instanz einer Klasse dynamisch erzeugen

Verfasst: Samstag 11. Juni 2011, 19:47
von smith0815
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.

Re: Instanz einer Klasse dynamisch erzeugen

Verfasst: Samstag 11. Juni 2011, 20:51
von 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?

Re: Instanz einer Klasse dynamisch erzeugen

Verfasst: Samstag 11. Juni 2011, 21:23
von smith0815
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???

Re: Instanz einer Klasse dynamisch erzeugen

Verfasst: Samstag 11. Juni 2011, 22:21
von 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)]

Re: Instanz einer Klasse dynamisch erzeugen

Verfasst: Samstag 11. Juni 2011, 22:34
von smith0815
ach ich Depp klar :oops:

Dank dir

Re: Instanz einer Klasse dynamisch erzeugen

Verfasst: Samstag 11. Juni 2011, 23:09
von derdon
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.