Hi!
Bitte um Verständnis, da ich noch immer Python Anfänger bin..
Ich möchte folgendes erreichen: zur Laufzeit habe ich den Modul- und Klassennamen (als strings) und möchte daraus eine Instanz der Klasse bekommen - wie geht das?
Btw, gibt's in Python so was wie Reflection in Java?
danke im voraus
dynamische Instanzierung?
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo aga!
Eine Möglichkeit wäre ``locals()``:
mfg
Gerold
Eine Möglichkeit wäre ``locals()``:
Code: Alles auswählen
>>> class Hallo:
... pass
...
>>> h = locals()["Hallo"]()
>>> h
<__main__.Hallo instance at 0x01AA4C38>
>>>
mfg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Mit den locals() fällt man nur innerhalb von Funktionen auf die Schnauze.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo birkenfeld!birkenfeld hat geschrieben:Mit den locals() fällt man nur innerhalb von Funktionen auf die Schnauze.
Manchmal verstehe ich dich nicht. Warum schreibst du nur "das geht nicht" und zeigst keine Lösung auf?
@aga: Wenn ``locals()`` nicht funktioniert, dann könnte ``globals()`` funktionieren. Wenn du die Klassen in ein anderes Modul geschrieben hast, dann musst du das Modul vorher importieren und statt ``globals()`` mit ``getattr(<modulobjekt>, "Klassenname")`` an die Sache heran gehen.
mfg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
-
- User
- Beiträge: 1790
- Registriert: Donnerstag 28. Oktober 2004, 16:33
- Wohnort: Graz, Steiermark - Österreich
- Kontaktdaten:
locals() ist langsam und funktioniert nur im globalen Scope. aga hat aber weder einen scope noch klingt locals() nach einer eleganten Lösung. Wenn er Klassen und Modulnamen hat kann er ja das machen:
Code: Alles auswählen
def create_instance(*args, **kwargs):
module, class_ = args[:2]
cls = getattr(__import__(module, None, None, ['']), class_)
return cls(*args[2:], **kwargs)
foo = create_instance("my.module", "MyClass", "some", "arguments", keywordargumets="too")
TUFKAB – the user formerly known as blackbird
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi blackbird!blackbird hat geschrieben:locals() ist langsam
Das ist interessant. Ich verwende locals() ziemlich gerne. Durch was könnte ich es ersetzen, ohne jede Variable einzeln angreifen zu müssen, oder alles schon vorab in ein Dictionary zu legen? Warum ist locals() langsam?
Nur so als Beispiel :
Code: Alles auswählen
vorname = "Max"
nachname = "Mustermann
alter = 10
print "ID: %(nachname)s_%(vorname)s: %(vorname)s %(nachname)s ist %(alter)i Jahre alt" % locals()
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Weil ich nicht so viel Zeit habe, ständig so viel zu schreiben -- außerdem könnt ihr das viel besser.gerold hat geschrieben:Manchmal verstehe ich dich nicht. Warum schreibst du nur "das geht nicht" und zeigst keine Lösung auf?
IMO ist locals() an sich ja ein guter Hinweis, und man kann als engagierter Programmierer auch selbst herausfinden, warum locals() hier nicht passt und dass es auch globals() gibt. So schlecht ist die Doku ja nicht.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Ja, wenn man das Ruby-Beispiel (oder auch das Java-Beispiel) übersetzt:aga hat geschrieben:Btw, gibt's in Python so was wie Reflection in Java?
Code: Alles auswählen
class Foo(object):
def hello(self):
print 'hello'
# sieht recht kompliziert aus, ist aber eigentlich ganz simpel
getattr(globals()['Foo'](), 'hello')()
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Danke, das war genau was ich gesucht habe ...
Code: Alles auswählen
def create_instance(*args, **kwargs): module, class_ = args[:2] cls = getattr(__import__(module, None, None, ['']), class_) return cls(*args[2:], **kwargs) foo = create_instance("my.module", "MyClass", "some", "arguments", keywordargumets="too")