Modul zur laufzeit laden

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
jeroen
User
Beiträge: 11
Registriert: Dienstag 20. November 2007, 16:37

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:


GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
jeroen
User
Beiträge: 11
Registriert: Dienstag 20. November 2007, 16:37

hi,

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


jeroen
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ü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.
jeroen
User
Beiträge: 11
Registriert: Dienstag 20. November 2007, 16:37

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
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

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
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
jeroen
User
Beiträge: 11
Registriert: Dienstag 20. November 2007, 16:37

ok danke damit komm ich weiter.

aber wie mache ich jetzt aus dem subclassen ein object ?

jeroen
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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'>
jeroen
User
Beiträge: 11
Registriert: Dienstag 20. November 2007, 16:37

danke habes hin bekommen
Antworten