Python 使用类的名称实例化类的对象
我想编写一个python实用程序,给定一个类名作为输入(可能是字符串),连同可以找到该类的模块名以及该类构造函数的参数,它实例化此类对象Python 使用类的名称实例化类的对象,python,reflection,Python,Reflection,我想编写一个python实用程序,给定一个类名作为输入(可能是字符串),连同可以找到该类的模块名以及该类构造函数的参数,它实例化此类对象 这在python中可以实现吗?如果是,最好的选择是什么?您可以使用;使用该选项检索对所需类对象的引用: klass = getattr(module, classname) instance = klass(*args, **kw) 其中,module是一个模块对象,classname是一个带有类名称的字符串,args是一个位置参数序列,kw是一个带有关键字
这在python中可以实现吗?如果是,最好的选择是什么?您可以使用;使用该选项检索对所需类对象的引用:
klass = getattr(module, classname)
instance = klass(*args, **kw)
其中,module
是一个模块对象,classname
是一个带有类名称的字符串,args
是一个位置参数序列,kw
是一个带有关键字参数的映射
要从字符串中获取模块名称,请使用动态导入:
import importlib
module = importlib.import_module(modulename)
您甚至可以接受最终类的虚线路径标识符,只需将其拆分为模块名和类,并使用:
modulename, _, classname = identifier.rpartition('.')
演示:
导入导入库
>>>标识符='collections.defaultdict'
>>>modulename,u3;,classname=identifier.rpartition('.'))
>>>modulename,类名称
('collections','defaultdict')
>>>args=(int,)
>>>kw={}
>>>module=importlib.import\u模块(modulename)
>>>klass=getattr(模块,类名)
>>>克拉斯
>>>实例=klass(*args,**kw)
>>>实例
defaultdict(,{})
为什么不
modulename,classname=identifier.rsplit('.',1)
?@kroolik:str.rpartition()
对于单个拆分的情况更快。确实,有任何特定的源代码吗?看起来速度是原来的两倍。@kroolik:不同的用例意味着它可以使用不同的算法rpartition
知道它只需要创建两个字符串对象,并且在找到分隔符后就知道它们的长度rsplit
必须做更多的工作;创建结果列表,复制每个分割的结果(它不会针对maxslit==1
情况进行优化),并且每个结果的长度都是可变的。只是慢了一点。再见,谢谢!我刚才才看到那些文件;-)
>>> 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'>, {})