自动实例Python

2024-09-30 04:27:12 发布

您现在位置:Python中文网/ 问答频道 /正文

假设src文件夹中有以下结构:

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

我想要的是配置文件自动实例化mod*.py中的类,这样如果有一天我要添加mod3.py-->mod3Class,它将自动实例化在配置文件没有添加任何代码行。在

我试过了,但没有成功:

^{pr2}$

但我无法导入,我收到一个名称错误。所以我在第一步就被卡住了。另外,假设我能够成功地执行导入,我该怎么做:

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

以自动的方式?我不能使用字符串来创建类的实例,所以我无法获取驱动程序中的文件名并使用字符串。做这个手术的正确方法是什么?在

谢谢


Tags: 实例instance字符串inpysrc文件夹conf
2条回答

这将在目录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

也许,这正是你需要的:

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()

而且,还应该在drivers文件夹中创建__init__.py文件。这意味着您的文件夹是一个python模块。在

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

相关问题 更多 >

    热门问题