python - 动态实例化对象

标签 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() 的安全问题。如果有的话,我很想听听其他方法。我唯一能想到的另一件事是获取脚本,将其物理保存到节点包目录中,然后导入它,但这似乎更疯狂。

最佳答案

您需要使用 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 .

关于python - 动态实例化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35234671/

相关文章:

arrays - 用数组存储数组 - Swift

c++ - 单行类声明和实例化

c++ - 在类中声明对象时可能会导致此错误的原因是什么?

python - 从另一个模块访问全局变量

python - 以之字形方式连接字符串列表的算法

python - 使用 django orm 和 postgresql 的累积(运行)总和

python - 获取遗传算法中使用的对象的值

Python 没有正确解释正则表达式

java - 创建String对象时创建了多少个对象

javascript - 从找到匹配项的数组中删除对象时遇到问题