class-Import

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
damu
User
Beiträge: 2
Registriert: Dienstag 30. Dezember 2014, 18:13

Hi,

ich hab folgendes Gefrickel:
Ein Hauptscript mit dem ich Klassen dynamisch beim Start importieren möchte:

Code: Alles auswählen

import os
import sys

pluginPath = "./plugins"
plugins = []

def loadPlugins():
    sys.path.append(os.path.abspath(pluginPath))
    
    for f in os.listdir(os.path.abspath(pluginPath)):
        fname, ext= os.path.splitext(f)
        if ext == '.py':
            plugins.append(__import__(fname,globals(), locals()))

loadPlugins()
Und in dem Ordner Unterordner "plugins" sollen Scripte in der Form des Folgenden liegen (dabei gilt name.py = class name):

Code: Alles auswählen

class foobar(object):
    def __init__(self):
        self.pluginInfo = {'name' : "foobar", 'version' : 1}
    def funktion1():
        pass
    def funktion2():
        pass
Wie kann ich nun im Hauptscript eine Instanz der importieren Klassen erstellen?
Ein Weg, den ich entdeckt habe, wäre außerhalb der Klasse eine Funktion zu bauen:

Code: Alles auswählen

def classInit():
    foo = foobar()
    return foo
Und das aus dem Hauptscript so aufzurufen:

Code: Alles auswählen

for x in plugins:
    plug = x.classInit()
    print plug.pluginInfo['name']
Gibt's denn dafür eine andere/bessere Lösung?
Ist loadPlugins() an und für sich ok oder würde man das anders/eleganter lösen?

Danke schonmal fürs Feedback.

Gruß,
Dave
BlackJack

@damu: Ich verstehe den Sinn der `classInit()` nicht so ganz, denn wenn Du die aufrufen kannst, warum kannst Du nicht auch einfach die Klasse direkt aufrufen‽ Dann musst Du der halt entweder einen festen Namen geben, oder den anhand des Modulnamens ermitteln.

Bezüglich der Namensschreibweisen solltest Du mal einen Blick in den Style Guide for Python Code werfen.
damu
User
Beiträge: 2
Registriert: Dienstag 30. Dezember 2014, 18:13

BlackJack hat geschrieben:warum kannst Du nicht auch einfach die Klasse direkt aufrufen‽ Dann musst Du der halt entweder einen festen Namen geben, oder den anhand des Modulnamens ermitteln.
Die Frage ist ja wie ich sie direkt aufrufen soll/kann bzw. wie ich den Modulnamen ermitteln kann..
BlackJack

@damu: So ziemlich alles was vom Programmierer mit anderen Mitteln als einer Zuweisung definiert wurde hat ein `__name__`-Attribut, so auch Module.
Antworten