Python 在模块中定义的类的动态导入
我有一个模块Class3.py,其中包含以下代码: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变量将保存一个关于这个模块的所有信息的字典,但我只对从中获
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':}