Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在模块中定义的类的动态导入_Python_Python 3.x - Fatal编程技术网

Python 在模块中定义的类的动态导入

Python 在模块中定义的类的动态导入,python,python-3.x,Python,Python 3.x,我有一个模块Class3.py,其中包含以下代码: from common.Step import Step from StageThree.Class2 import Class2 class Class3(Step): pass 我的项目中有一个逻辑,它将动态访问此模块,并将其读入: module = importlib.import_module(module_name, package_path) 现在,module变量将保存一个关于这个模块的所有信息的字典,但我只对从中获

我有一个模块Class3.py,其中包含以下代码:

from common.Step import Step
from StageThree.Class2 import Class2

class Class3(Step):
    pass
我的项目中有一个逻辑,它将动态访问此模块,并将其读入:

module = importlib.import_module(module_name, package_path)
现在,module变量将保存一个关于这个模块的所有信息的字典,但我只对从中获取Class3的句柄感兴趣,以便稍后进行动态实例化。我用下面的代码对这条命令进行排序:

dict([(name, cls) for name, cls in module.__dict__.items() if isinstance(cls, type)])
这就产生了这个结果:

{'Step': <class 'common.Step.Step'>, 'Class2': <class 'StageThree.Class2.Class2'>, 'Class3': <class 'StageThree.Class3.Class3'>}

如果没有上述暴力手段,您仍然有兴趣查看是否有任何有效的方法。您也可以检查
\uuuu模块的名称:

import importlib


class ModuleInspector(object):
    def __init__(self):
        self.module = None

    def getClassesInModule(self, localOnly=True):
        """
        localOnly, returns only locally defined classes in that particular module.
        """
        _classes = {}
        for k, v in self.module.__dict__.items():
            if isinstance(v, type):
                if not localOnly or v.__module__ == self.module.__name__:
                    _classes[k] = v
        return _classes

    def importFromFile(self, fpath, name=None):
        try:
            self.module = importlib.import_module(name, fpath)
        except:
            traceback.print_exc()


if __name__ == '__main__':
    i = ModuleInspector()
    i.importFromFile('/tmp/class3.py', 'class3')
    available_classes = i.getClassesInModule(localOnly=False)
    declared_classes_names = i.getClassesInModule()

    print(available_classes)
    print(declared_classes_names)
输出:

{'Queue': <class 'queue.Queue'>, 'scheduler': <class 'sched.scheduler'>, 'Class3': <class 'class3.Class3'>}
{'Class3': <class 'class3.Class3'>}
{'Queue':,'scheduler':,'Class3':}
{'Class3':}

您还可以检查
\uuuuuu模块的名称:

import importlib


class ModuleInspector(object):
    def __init__(self):
        self.module = None

    def getClassesInModule(self, localOnly=True):
        """
        localOnly, returns only locally defined classes in that particular module.
        """
        _classes = {}
        for k, v in self.module.__dict__.items():
            if isinstance(v, type):
                if not localOnly or v.__module__ == self.module.__name__:
                    _classes[k] = v
        return _classes

    def importFromFile(self, fpath, name=None):
        try:
            self.module = importlib.import_module(name, fpath)
        except:
            traceback.print_exc()


if __name__ == '__main__':
    i = ModuleInspector()
    i.importFromFile('/tmp/class3.py', 'class3')
    available_classes = i.getClassesInModule(localOnly=False)
    declared_classes_names = i.getClassesInModule()

    print(available_classes)
    print(declared_classes_names)
输出:

{'Queue': <class 'queue.Queue'>, 'scheduler': <class 'sched.scheduler'>, 'Class3': <class 'class3.Class3'>}
{'Class3': <class 'class3.Class3'>}
{'Queue':,'scheduler':,'Class3':}
{'Class3':}