我想编写一个python实用程序,给定一个类名作为输入(可能是一个字符串),以及可以找到该类的模块的名称,以及该类的构造函数的参数,它实例化此类的对象。
这在python中可以做些什么吗?如果是,那么最佳选择是什么?
答案 0 :(得分:3)
您可以使用getattr()
function访问模块中的任何名称;用它来检索对所需类对象的引用:
klass = getattr(module, classname)
instance = klass(*args, **kw)
其中module
是模块对象,classname
是一个带有类名称的字符串,args
是一系列位置参数,kw
是一个带有关键字参数的映射。
要从字符串中获取模块名称,请使用importlib.import_module()
动态导入:
import importlib
module = importlib.import_module(modulename)
您甚至可以接受最终类的虚线路径标识符,只需将其拆分为模块名称和类:
modulename, _, classname = identifier.rpartition('.')
演示:
>>> import importlib
>>> identifier = 'collections.defaultdict'
>>> modulename, _, classname = identifier.rpartition('.')
>>> modulename, classname
('collections', 'defaultdict')
>>> args = (int,)
>>> kw = {}
>>> module = importlib.import_module(modulename)
>>> klass = getattr(module, classname)
>>> klass
<type 'collections.defaultdict'>
>>> instance = klass(*args, **kw)
>>> instance
defaultdict(<type 'int'>, {})