Path: csiph.com!news.swapon.de!aioe.org!.POSTED!not-for-mail From: Peter Otten <__peter__@web.de> Newsgroups: de.comp.lang.python Subject: Re: Klassen rekursiv in einem Modul instantiieren Date: Wed, 10 Oct 2018 10:32:05 +0200 Organization: None Lines: 62 Message-ID: References: NNTP-Posting-Host: uGaJhIaF16Crc/KX+zgQTw.user.gioia.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8Bit X-Complaints-To: abuse@aioe.org User-Agent: KNode/4.13.3 X-Notice: Filtered by postfilter v. 0.8.3 Xref: csiph.com de.comp.lang.python:5273 Philipp Kraus wrote: > Danke für die 2 hilfreichen Antworten. > > Ich habe aktuell in meiner algorithm.py eine Klasse > > class Algorithm(object) : > .... > > und dann entsprechend in allen anderen *.py > > class MyAlgo(Algorithm): > ... > > meine Frage ist, wie importiere ich "alles", ich habe es mit __all__ in > der __init__.py probiert, ich möchte in meiner __main__.py am liebsten > from mymodule.algorithm import * sagen können und dann einmal über alle > iterieren können. Wenn man unter "alles" alle Untermodule eines Pakets versteht landet man bei einer Plugin-Architektur. I hab das hier mal implementiert: import os import importlib from mymodule.algorithm import algorithm import mymodule.algorithm.distance def subclasses(cls): yield cls for c in cls.__subclasses__(): yield from subclasses(c) def find_plugins(package): root = os.path.dirname(package.__file__) for path, folders, files in os.walk(root): rpath = os.path.relpath(path, root) subpackage = package.__name__ if rpath != os.curdir: subpackage += "." + rpath.replace(os.sep, ".") for name in files: if name == "__init__.py": yield subpackage elif name.endswith(".py"): yield subpackage + "." + name[:-3] def load_plugins(package): for module in find_plugins(package): importlib.import_module(module) load_plugins(mymodule.algorithm.distance) for sub in subclasses(algorithm.Algorithm): print(sub) Da der Code von find_plugins() doch komplizierter wurde, als ich das erwartet habe, schlage ich vor, dass du dich mal auf Pypi umschaust. Bestimmt gibt es dort schon etwas in der Art, möglichst mit vertrauenerweckender Testsuite ;) PS: Sehe gerade, dass Hartmut die stdlib besser kennt als ich...