ich möchte zur Zeit in Zuge eines Projekts eine Anwendung entwickeln,
die einen Objekt Manager nutzt, um eigene Module zu laden. Dies möchte
ich mit Klassen / Objekten realisieren. Folgende Voraussetzungen habe
ich Vornherein festgelegt :
1. Der Objekt Manager 'OM.py' wird nur einmalig beim Start der Anwendung initialisiert
2. Der Objekt Manager hat eine ( globale ? ) Variable, die überall in der Anwendung verfügbar ist
3. Die ( globale ) Variable heisst "Registered_Modules" & ist ein Dictionary
4. Das Paar im Dictionary 'Registered_Modules" hat immer das Format { "Name" : <Objekt des jeweiligen Moduls }
5. Über das o. g. Objekt kann man auf die Variablen der jeweiligen Module zugreifen, die dieses
bei der Objekterstellung im OM zurückgibt.
Code: Alles auswählen
class OM:
Registered_Modules = {}
def __init__(Self, Module="", Debug_Mode=False):
Self.Debug_Mode = Debug_Mode
Self.Registered_Modules = OM.Registered_Modules
print(f"Debug Mode : {Debug_Mode}")
Code: Alles auswählen
def Load_Module(Self, Module=""):
if Module:
Module_Properties = OM.Register_Module(Self, Module)
return Module_Properties
else:
print(f"[ ERROR ] No Module Specified !")
Die Load - Methode ist leitet das Modul an die Methode 'Register_Module' :
Code: Alles auswählen
def Register_Module(Self, Module):
if Module not in Self.Registered_Modules:
print(f"[ MSG ] The Specified Module '{Module}' Is Not Registered !")
else:
print(f"[ ERROR ] The Specified Module '{Module}' Is Already Registered !")
return Registered_Modules[Module]
Module_Descriptor = Module.split("::", -1)[-1]
Module_FH = Module
Module_FH = Module_FH.replace("::", "/") + ".py"
Module_Instance = importlib.import_module(Module.replace("::", "."))
Module_Methods = [
method_name
for method_name in dir(Module_Instance)
if callable(getattr(Module_Instance, method_name))
]
if Module_Descriptor not in Module_Methods:
print(
f"[ ERROR ] The Constructor Of The Specified Module '{Module}' Could Not Be Found !"
)
exit(0)
Module_Attributes = getattr(Module_Instance, Module_Descriptor)()
Self.Registered_Modules.update({Module_Descriptor: Module_Attributes})
return Module_Instance
Code: Alles auswählen
from OM import *
Code: Alles auswählen
from OM import *
class VTE:
def __init__(Self):
Self.OM_Manager = OM()
Self.OM_Manager.Load_Module("Testumgebung::Test::Neu")
CFG = Self.OM_Manager.Load_Module("Config")
CFG.Config_Loader(Self)
Leider habe ich hier noch ein paar offenen Probleme bzw. Fragen :
1. Da ich überall in der Anwendung auf die Variable "Registered_Modules" zugreifen
möchte, muss ich diese als globale Variable definieren oder sehe ich das falsch ?
2. Ich gebe zur Zeit im OM bei Laden eines Moduls anschließend die Modul - Instanz
zurück :
Code: Alles auswählen
return( Module_Instance )
Vorher habe ich das Objekt aus der Variable 'Registered_Modules" zurückgeben :
Code: Alles auswählen
return( Self.Registered_Modules[ Module_Descriptor ] )
Hintergrund ist, dass ich so auch direkt Klassen aus den Modulen aufrufen kann.
Welche Variante ist die bessere / richtigere von Beiden ?
3. Seht ihr grundsätzlich ( außer bei der Schreibweise der Variablen ) Verbesserungspotential,
kann man die Funktionalität noch verbessern.
Für Eure Hilfe & Ratschläge wäre ich sehr dankbar.
Vielen Grüße
YAPD