[Python-de] Dynamisch Module Nachladen wenn die Namen erst zur Laufzeit bekannt sind?

Hartmut Goebel h.goebel at goebel-consult.de
Do Nov 15 20:44:48 UTC 2007


Bastian Venthur schrieb:

> On 15.11.2007 17:33 schrieb Gerald Klix:
>> def loadPlugin( name ):
>> 	return getattr( __import__( name ), name )
> 
> nur den Typen zurück, aber kein "lebendes" Objekt.

Das kommt immer darauf an, was sich für ein Objekt sich hinter dem Namen
verbirgt. Wenn das ein Typ (Du meinst wohl eine Klasse) ist, bekommst Du
natürlich die Klasse. Um das "lebendige Objekt" zu bekommen, musst Du
die Klasse erst instanzieren.

> Wenn "mod" mein erfolgreich dynamisch geladenes Modlul ist, funktioniert
> zwar
>   self.plugin = mod.Foo()

Das liefert Dir das Ergebnis der Funktion Foo(), bzw. eine Instanz der
Klasse Foo, falls Foo eine Klasse ist.

> aber nicht
>   self.plugin = getattr(mod, "Foo")

Das leifert Dir das Objekt mit dem Namen Foo.

> TypeError: unbound method bar() must be called with Foo instance as
> first argument (got type instance instead)

Ich vermute, Du willst self.plugin.bar() aufrufen. Klar, dass das _so_
nicht geht, den self.plugin ist die Klasse Foo, keine Instanz davon. Was
Du möchtest ist wahrscheinlich

   self.plugin = getattr(mod, "Foo")()

-- 
Schönen Gruß - Regards
Hartmut Goebel

Goebel Consult
Spezialist für IT-Sicherheit in komplexen Umgebungen
http://www.goebel-consult.de

-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : signature.asc
Dateityp    : application/pgp-signature
Dateigröße  : 481 bytes
Beschreibung: OpenPGP digital signature
URL         : http://python.net/pipermail/python-de/attachments/20071115/8510ba0d/attachment.pgp