Frage zu Klassen/Modulen

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
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Hallo Pythonfreunde,

Ich arbeite gerade an einen großen Programm.
Ich habe in diesen Projekte die Packagestruktur folgendermasen aufgebaut:
lib/
common/
tabs/
...

Nur Importiere ich haufenweise die gleichen Module und dadurch der Tabmanager rekusiv ist ruft er sich immer wieder auf, was ein wenig zeit bei der Generierung brauch, da das ganze dynamisch erst erzeugt wird. Daher habe ich mir für die Performe gedacht ich importiere einmal alle Klassen und registriere sie in ein Dict.

Ich habe da schon was gebastelt und getestet:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

class ClassRegister():
    """This registered all classes"""
    
    def __init__(self):
        self.classes = {}

    def registerClass(self, name, classobject):
        self.classes[name] = classobject
        
    def getClassInstanz(self, name):
        return self.classes[name]

Code: Alles auswählen

    cr = ClassRegister()
    cr.registerClass("Gtk", Gtk)
    cr.registerClass("Gdk", Gdk)
Die Verwendung:

Code: Alles auswählen

        self.Gtk = classregister.getClassInstanz("Gtk")
        self.Gdk = classregister.getClassInstanz("Gdk")
Ist das sinnvoll?
Wie könnte man das Besser lösen?
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
BlackJack

@jtschoch: Wie könnte man *was* besser lösen? Ich habe den Verdacht Du versuchst da etwas zu lösen was überhaupt gar kein Problem ist. Ein Modul kann man so oft importieren wie man möchte — nur beim ersten Mal wird der Code auf Modulebene ausgeführt — danach wird das bereits importierte Modul einfach nur intern in einem Wörterbuch nachgeschlagen.
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Also Python hat da schon eine Lösung drin?
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

jtschoch hat geschrieben:Also Python hat da schon eine Lösung drin?
Ja. Wie BlackJack bereits schrieb, wird nur beim ersten Import der Code (des importierten Moduls) auf modulebene ausgeführt. Bei allen folgenden Imports wird einfach nur die Referenz auf das Modul übernommen. Füge einfach mal print-Statements ein, dann siehst du was passiert.
Das Leben ist wie ein Tennisball.
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

OK, Vielen Dank.
Habe ich noch nicht gewusst.

Edit noch eine kleine Frage:

Ist es auch der Fall wenn ich Klassen importiere?

Gtk <gi.module.DynamicModule 'Gtk' from '/usr/lib/girepository-1.0/Gtk-3.0.typelib'>
Klasse aus Modul <class 'lib.language.LanguageManager.LanguageManager'>
Modul <module 'lib.learnpages.PagesStore' from '/home/jtschoch/workspace/School/lib/learnpages/PagesStore.pyc'>
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dam importiert nie Klassen, sondern Module. Wenn du einen Namen explizit aus nem Modul importierst (sei das jetzt nun ein Klassenobjekt, ein beliebiges Objekt oder ein Modulobjekt) wird erst das Modul importiert, die Klasse an den von dir gewünschten Namen gebunden und dann der Name des Moduls verworfen. Importiert wird das Modul trotzdem und wird auch im Modul-Cache eingetragen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten