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

时间:2014-11-19 20:57:29

标签: python reflection

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

这在python中可以做些什么吗?如果是,那么最佳选择是什么?

1 个答案:

答案 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'>, {})