1

src フォルダーに次の構造があるとします。

conf.py
./drivers
    mod1.py --> contains mod1Class
    mod2.py --> contains mod2Class

私が欲しいのは、conf.py のコードのスニペットで、mod*.py のクラスを自動的にインスタンス化して、いつか mod3.py --> mod3Class を追加すると、これが conf で自動的にインスタンス化されるようにすることです。コード行を追加せずに py を実行します。

私は成功せずに試しました:

from drivers import *

しかし、インポートできません。NameError が発生します。だから私は最初のステップで立ち往生しています。また、インポートを正常に実行できるとします。どうすればよいですか。

mod1Class_instance = mod1.mod1Class() (in a cycle, one instance for every file in drivers)

自動的に?文字列を使用してクラスのインスタンスを作成できないため、ドライバーでファイルの名前を取得して文字列を使用することができません。この操作を行う正しい方法は何ですか?

ありがとう

4

2 に答える 2

1

多分、それはあなたが必要とするものです:

from types import ModuleType

import drivers

for driver_module in dir(drivers):
    if not isinstance(driver_module, ModuleType):
        continue # not real module driver
    for cls in dir(driver_module):
        if not isinstance(cls, SomeBaseClass):
             continue # not real mod class
        # create new variable with name as lower class name
        locals()[cls.__name__.lower()] = cls()

また、フォルダ内__init__.pyにファイルを作成する必要がありdriversます。これは、フォルダがpython-moduleであることを意味します。

一方、すべてのインポートを手動で記述することをお勧めします。この単純なアプローチにより、コードがより明確になります。

于 2012-12-20T17:25:49.210 に答える
0

これは、現在のモジュールと同じディレクトリにある directory 内のモジュールのクラスをロードし、パッケージdriversを作成する必要はありません。drivers

from collections import defaultdict
import os
import pkgutil


def getclasses(module):
    """Get classes from a driver module."""
    # I'd recommend another way to find classes; for example, in defuz's 
    # answer, classes in driver modules would have one base class.
    try:
        yield getattr(module, module.__name__ + "Class")
    except AttributeError:
        pass

instances = defaultdict(list)
drivers_dir = os.path.join(os.path.dirname(__file__), 'drivers')
for module_loader, name, ispkg in pkgutil.iter_modules([drivers_dir]):
    module = module_loader.find_module(name).load_module(name)
    for cls in getclasses(module):
        # You might want to use the name of the module as a key instead of the  
        # module object, or, perhaps, to append all instances to a same list.
        instances[module].append(cls())

# I'd recommend not putting instances in the module namespace, 
# and just leaving them in that dictionary.
for mod_instances in instances.values():
    for instance in mod_instances:
        locals()[type(instance).__name__ + "_instance"] = instance
于 2012-12-20T17:56:42.217 に答える