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__.pydrivers文件夹中创建文件。这意味着您的文件夹是一个 python 模块。

另一方面,我建议手动描述所有导入。这种简单的方法使您的代码更加清晰。

于 2012-12-20T17:25:49.210 回答
0

这会在一个目录中加载模块中的类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 回答