0

私は次のインターフェースを持っています:

class Interface(object):

    __metaclass__ = abc.ABCMeta


    @abc.abstractmethod
    def run(self):
        """Run the process."""
        return

すべて同じディレクトリにあるモジュールのコレクションがあります。各モジュールには、私のインターフェースを実装する単一のクラスが含まれています。

たとえば、 Launch.py​​ :

class Launch(Interface):

    def run(self):
        pass

20 個のクラスを実装する 20 個のモジュールがあるとします。一部のクラスがインターフェイスを実装していないかどうかをチェックするモジュールを起動できるようにしたいと考えています。

私は使用しなければならないことを知っています:

  • issubclass(Launch, ProcessInterface) を使用して、特定のクラスがプロセス インターフェイスを実装しているかどうかを確認します。
  • 私のモジュールにあるクラスを取得するためのイントロスペクション。
  • 実行時にモジュールをインポートする

どうすればいいのかわかりません。モジュール内で issubclass を使用することができます。しかし、モジュールの外にいる場合は issubclass を使用できません。

する必要がある :

  1. ディレクトリ内のすべてのモジュールのリストを取得します
  2. 各モジュールでクラスを取得する
  3. 各クラスで issubclass を実行します

それを行うことができる関数のドラフトが必要です。

4

1 に答える 1

0

あなたはおそらく次のようなものを探しています:

from os import listdir
from sys import path

modpath = "/path/to/modules"

for modname in listdir(modpath):
    if modname.endswith(".py"):

        # look only in the modpath directory when importing
        oldpath, path[:] = path[:], [modpath]

        try:
            module = __import__(modname[:-3])
        except ImportError:
            print "Couldn't import", modname
            continue
        finally:    # always restore the real path
            path[:] = oldpath

        for attr in dir(module):
            cls = getattr(module, attr)
            if isinstance(cls, type) and not issubclass(cls, ProcessInterface):
                # do whatever
于 2011-07-18T16:42:32.340 に答える