Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.python > #5273
| 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 | <ppkde6$c36$1@gioia.aioe.org> (permalink) |
| References | <c3736ae4-6baa-4147-9e97-4ef6a6b243ba@googlegroups.com> <ppj8td$qjg$1@gioia.aioe.org> <d545a2c2-a336-4805-882c-ba4279968f32@googlegroups.com> |
| 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 |
Show key headers only | View raw
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...
Back to de.comp.lang.python | Previous | Next — Previous in thread | Next in thread | Find similar
Klassen rekursiv in einem Modul instantiieren Philipp Kraus <philipp.kraus.flashpixx@gmail.com> - 2018-10-09 13:29 -0700
Re: [Python-de] Klassen rekursiv in einem Modul instantiieren Florian Diesch <diesch@spamfence.net> - 2018-10-09 23:38 +0200
Re: Klassen rekursiv in einem Modul instantiieren Peter Otten <__peter__@web.de> - 2018-10-10 00:08 +0200
Re: Klassen rekursiv in einem Modul instantiieren Philipp Kraus <philipp.kraus.flashpixx@gmail.com> - 2018-10-09 22:21 -0700
Re: Klassen rekursiv in einem Modul instantiieren Peter Otten <__peter__@web.de> - 2018-10-10 10:32 +0200
Re: [Python-de] Klassen rekursiv in einem Modul instantiieren Hartmut Goebel <h.goebel@goebel-consult.de> - 2018-10-10 09:29 +0200
Re: [Python-de] Klassen rekursiv in einem Modul instantiieren Philipp Kraus <philipp.kraus.flashpixx@gmail.com> - 2018-10-10 09:51 -0700
csiph-web