Seite 1 von 1

Modul zur laufzeit laden

Verfasst: Sonntag 5. April 2009, 10:20
von jeroen
Hi,

ich will ein Python Modul zur Laufzeit nachladen, dieses enthält dann eine Klasse die ich instanzieren will.

Mein Problem ist das ich überhaupt nicht weiß wo ich da ansetzten kann.
Bisher weiß ich nur das ich das Modul m imp laden kann, alledings weiß ich dann nicht wie herrausfinde wie die klasse heißt.

jeroen

Verfasst: Sonntag 5. April 2009, 10:47
von jens

Verfasst: Sonntag 5. April 2009, 11:00
von cofi
Er weiss ja schon wie er das Modul lädt ;)

Per se geht das nicht, welche Hinweise hast du denn auf die Klasse? Erbt sie von einer anderen? Hat sie charakteristische Attribute?

Was willst du eigentlich machen? Alles was mir zu deinem Ansatz einfällt führt zu einem recht instabilen Kartenhäuschen.

Re: Modul zur laufzeit laden

Verfasst: Sonntag 5. April 2009, 11:01
von jens
jeroen hat geschrieben:weiß ich dann nicht wie herrausfinde wie die klasse heißt
Mit dir und inspect könnte man das importierte Modul untersuchen...

Verfasst: Sonntag 5. April 2009, 11:13
von jeroen
hi,

die klasse im modul ist schon ein ableitung von einer bestimmten klasse.
also könnte ich mit dieser info ansetzten ?


jeroen

Verfasst: Sonntag 5. April 2009, 12:20
von cofi
Über den Output von `dir` iterieren:

Code: Alles auswählen

In [1]: class AB(list):
   ...:     pass

In [2]: issubclass(AB, list)
Out[2]: True
Eine andere Möglichkeit wäre es `inspect.getmembers(MODUL)` zu nutzen. das gibt dir den Namen und seinen Typ als Tupel zurück.

Verfasst: Sonntag 5. April 2009, 13:36
von jeroen
hi,

ok mit dir gekommt man leider auch die importieren module im modul zurück. Das zu dem Problem führt das issubclass(AB, AB) = True ist.

Ein weiters Problem ist, wenn ich nur den Name der Klasse hätte wie mache dann ein object daraus ?

jeroen

Verfasst: Sonntag 5. April 2009, 13:49
von str1442

Code: Alles auswählen

In [1]: class A(object):
   ...:     pass
   ...: 

In [2]: class B(A):
   ...:     pass
   ...: 

In [3]: print A.__subclasses__()
[<class '__main__.B'>]

In [4]: print B.__name__ == "B"
True

Verfasst: Sonntag 5. April 2009, 13:52
von DasIch
Ich nutze für soetwas gerne diese Möglichkeit.

a.py ist dann so etwas wie ein pluginsystem Modul. b.py irgendein Plugin was importiert wird und c.py irgendein anderes Modul.

Verfasst: Sonntag 5. April 2009, 14:22
von jeroen
ok danke damit komm ich weiter.

aber wie mache ich jetzt aus dem subclassen ein object ?

jeroen

Verfasst: Sonntag 5. April 2009, 14:53
von cofi
Indem du sie aufrufst:

Code: Alles auswählen

In [19]: a = []

In [20]: type(a)
Out[20]: <type 'list'>

In [21]: type(a)()
Out[21]: []

In [22]: b = type(a)()

In [23]: type(b)
Out[23]: <type 'list'>

Verfasst: Sonntag 5. April 2009, 15:29
von jeroen
danke habes hin bekommen