动态实例化对象

时间:2016-02-05 22:31:36

标签: python object objectinstantiation

我试图从字符串中实例化一个对象。具体来说,我试图改变这个:

from node.mapper import Mapper
mapper = Mapper(file)
mapper.map(src, dst)

这样的事情:

with open('C:.../node/mapper.py', 'r') as f:
    mapping_script = f.read()

eval(mapping_script)
mapper = Mapper(file)
mapper.map(src, dst)

这个看似奇怪的任务的动机是能够在数据库中存储不同版本的映射脚本,然后根据需要检索/使用它们(强调map()方法的多态性)。

以上不起作用。出于某种原因,eval()抛出SyntaxError: invalid syntax.我不理解这一点,因为它与第一种情况下导入的文件相同。是否有某些原因导致eval()无法用于定义类?

我应该注意到我知道eval()周围的安全问题。如果有的话,我很想听听其他方法。我能想到的唯一另一件事是获取脚本,将其物理保存到节点包目录中,然后导入它,但这看起来更加疯狂。

1 个答案:

答案 0 :(得分:1)

您需要使用exec

exec(mapping_script)

eval()仅适用于表达式。 exec()适用于陈述。典型的Python脚本包含语句。

例如:

code = """class Mapper: pass"""
exec(code)
mapper = Mapper()
print(mapper)

输出:

<__main__.Mapper object at 0x10ae326a0>

确保在模块级别调用exec()(Python 3,在Python 2中它是一个语句)。在函数中调用它时,需要添加globals(),例如exec(code, globals()),以使对象在全局范围内可用,并按照here的要求在函数的其余部分中使用。