Python 使用类的名称实例化类的对象

Python 使用类的名称实例化类的对象,python,reflection,Python,Reflection,我想编写一个python实用程序,给定一个类名作为输入(可能是字符串),连同可以找到该类的模块名以及该类构造函数的参数,它实例化此类对象 这在python中可以实现吗?如果是,最好的选择是什么?您可以使用;使用该选项检索对所需类对象的引用: klass = getattr(module, classname) instance = klass(*args, **kw) 其中,module是一个模块对象,classname是一个带有类名称的字符串,args是一个位置参数序列,kw是一个带有关键字

我想编写一个python实用程序,给定一个类名作为输入(可能是字符串),连同可以找到该类的模块名以及该类构造函数的参数,它实例化此类对象


这在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'>, {})