如何使用python动态创建目录中所有类的实例?

时间:2016-09-10 22:50:01

标签: python dynamic constructor

我正在尝试做这样的事情:

from A.AA import Q, W
from A.AB import E
from A.B.ABA import R
from A.B.ABB import T, Y, U

objs = []
objs.append(Q())
objs.append(W())
objs.append(E())
objs.append(R())
objs.append(T())
# and so on...

上面的代码非常大,每次添加新类或模块时都会占用大量不必要的时间来更新它。相反,我想要一种从目录中的每个类和所有嵌套目录动态初始化对象的方法。可以抽象到以下内容的东西。

objs = []
for py_file in directory:
    for class in py_file:
        objs.append(construct_object_of_type(class))

作为旁注,所有这些类都继承自单个基类。此代码也将从顶级目录中的python文件中调用。

2 个答案:

答案 0 :(得分:0)

如果要实例化所有导入的对象,可以使用global()内置函数通过全局名称空间访问它们。

from A.AA import Q, W
from A.AB import E
from A.B.ABA import R
from A.B.ABB import T, Y, U

instances = [obj() for name, obj in globals().items() if not name.startswith('__')]

另请注意,基本上一次创建所有实例并不是一个好主意,一个原因是您可能不希望以所有方式使用所有实例,另一个可能是将特定参数传递给每个(或某些)类的构造函数,或者如果你有一些你不想实例化的导入对象,那么也必须处理它们,以及其他问题。

答案 1 :(得分:0)

所以我设法弄清楚如何做到这一点。

以下是代码:

import os
import imp
import inspect

obj_list = []

dir_path = os.path.dirname(os.path.realpath(__file__))
pattern = "*.py"

for path, subdirs, files in os.walk(dir_path):
    for name in files:
        if fnmatch(name, pattern):
            found_module = imp.find_module(name[:-3], [path])
            module = imp.load_module(name, found_module[0], found_module[1], found_module[2])
            for mem_name, obj in inspect.getmembers(module):
                if inspect.isclass(obj) and inspect.getmodule(obj) is module:
                    obj_list.append(obj())