Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.python > #5273

Re: Klassen rekursiv in einem Modul instantiieren

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 | NextPrevious in thread | Next in thread | Find similar


Thread

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