0

複数のモジュールを収集する python パッケージがあります。これらのモジュールには、Component クラスから継承した複数のクラスがあります。これらのクラスの負荷を動的にし、いくつかのオブジェクトを動的に構築したいと思います。

ex: 
package/module1.py
       /module2.py

ではmodule1.py、クラス Component から継承した複数のクラスがあり、 と同じでmodule2.py、もちろんクラスとパッケージの数は不明です。最終的なユーザーは、どのオブジェクトを構成ファイルに構築する必要があるかを定義します。モジュールを繰り返し処理するために、動作している pkgutil.iter_modules を使用します。コンポーネントを構築する担当の機能から、私は次のようにします。

[...]
myPckge = __import__('package.module1', globals(), locals(), ['class1'], -1)
cmpt_object = locals()[component_name](self, component_prefix, *args)
[...]

ただし、クラスが認識されないため、これは機能しません。次は機能しますが、動的ではありません。

cmpt_object = myPckge.class1(self, component_prefix, *args)

お返事をありがとうございます

4

2 に答える 2

0

を使用execfile()してモジュールをオンザフライでロードし、 を使用exec()してそれらから新しいオブジェクトを作成できます。しかし、なぜあなたがこれをしているのか理解できません!

于 2012-11-05T09:55:44.333 に答える
0

指定したモジュール内のクラスのサブクラスを見つけるには、次のようにします。

import inspect
def find_subclasses(module, parent_cls):
    return [clazz for name, clazz in inspect.getmembers(module)
        if inspect.isclass(clazz) and
        issubclass(clazz, parent_cls) and
        clazz.__module__ == module.__name__ and  # do not keep imported classes
        clazz is not parent_cls]

parent_cls返されるクラスの直接の親である必要はないことに注意してください。

次に、モジュールの名前とディレクトリ、および必要なクラスの親クラスを知っていれば、モジュールからクラスを動的にロードできます。

import imp
def load_classes(module_name, module_dir, parent_cls):
    fle, path, descr = imp.find_module(module_name, [module_dir])
    if fle:
        module = imp.load_module(module_name, fle, path, descr)
        classes = find_subclasses(module, parent_cls)
        return classes
    return []  # module not found
于 2012-11-05T10:09:12.457 に答える