[Python-de] Klassen rekursiv in einem Modul instantiieren

Philipp Kraus philipp.kraus.flashpixx at gmail.com
Mi Okt 10 12:51:46 EDT 2018


Vielen Dank für die Antworten. Ich habe nun folgendes geabut

---
def classlist(package, baseclass=object, recursive=True):
    if isinstance(package, str):
        package = importlib.import_module(package)

    results = []
    for _, name, is_pkg in pkgutil.walk_packages(package.__path__):
        full_name = package.__name__ + '.' + name

        if not is_pkg:
            for c in importlib.import_module((full_name)).__dict__.values():
                if isinstance(c, type) and issubclass(c, baseclass) and not c == baseclass:
                    results.append(c)
        
        if recursive and is_pkg:
            results.extend(classlist(full_name, baseclass, recursive))

    return results 
---

mein Aufruf sieht dann so aus

---
classlist(mymodule.algorithm, mymodule.algorithm.Algorithm)
---

er geht die Module rekursiv durch, holt sich dann alle Klassen, prüft die Klassen, ob sie von der Basisklasse abgeleitet wurden (überspringt ggf die Basisklasse) und liefert eine Liste mit Klassen zurück, die dann einfach instantiiert werden können. Ich habe noch die Basisklasse in die __init__.py verlagert, es macht eine klarere Struktur

Danke für die Hilfe

Phil


Am Mittwoch, 10. Oktober 2018 09:38:05 UTC+2 schrieb Hartmut Goebel:
> Am 09.10.2018 um 22:29 schrieb Philipp Kraus:
> > Ich möchte jetzt in der __main__.py einmal rekursiv über alle *.py Dateien in algorithm durch gehen und aus jeder *.py Datei die Klasse instantiieren
> 
> Am besten wohl mit pkgutil.walk_modules. Falls es nicht rekursiv sein
> soll, mit pkgutil.iter_modules.
> 
> Ungefähr so (siehe auch doc-string der Funktionen)
> 
> print([b
>       for a,b,c in 
>       pkgutil.iter_modules(
>           mymodule.algorithm.__path__,
>           mymoduel.algorithm.__name__+".")])
> 
> Dabei bekommst Du natürlich auch mymodule.algorithm.algorithm. Überlege
> Dir mal, ob Du den Code dieses module nicht in das Paket (alsi die
> __init__.py-Datei) von mymodule.algorithm versheiben kannst. Dann sparst
> Du das filtern.
> 
> Wenn Dir dieser Tipp geholfen hat, habe ich eine Bitte: Probiere aus, ob
> das auch noch funktioniert, wenn Du Dein Programm mit PyInstlaller
> packetiert hast. (Hierzu musst Du wohl erstmal alle Sub-Module als
> --hidden-import angeben, oder einen zwei-Zeiler "hook" schreiben.)
> Schick mir dann bitte eine Nachricht oder mache auf Github einen
> Bug-Report auf. Herzlichen Dank!
> 
> -- 
> Schönen Gruß
> Hartmut Goebel
> Dipl.-Informatiker (univ), CISSP, CSSLP, ISO 27001 Lead Implementer
> Information Security Management, Security Governance, Secure Software
> Development
> 
> Goebel Consult, Landshut
> http://www.goebel-consult.de
> 
> Blog:
> https://www.goe-con.de/blog/nicht-pgp-ist-gescheitert-die-entwickler-haben-versagt
> 
> Kolumne:
> https://www.goe-con.de/hartmut-goebel/cissp-gefluester/2011-08-horrorszenario-bring-your-own-device



Mehr Informationen über die Mailingliste python-de