繁体   English   中英

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

[英]How do I dynamically create instances of all classes in a directory with python?

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

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文件中调用。

如果要实例化所有导入的对象,则可以使用内置的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('__')]

还要注意,基本上一次创建所有实例不是一个好主意,一个原因是您可能不想全部使用它们,而另一个可能是将特定参数传递给每个实例的构造函数的问题(或某些)类,或者如果您有一些不想实例化的导入对象,那么也必须照顾它们,以及另一个问题。

所以我设法弄清楚该怎么做。

这是它的代码:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM