创建从字符串命名的类对象实例?
问题描述:
我无法在任何地方找到答案。创建从字符串命名的类对象实例?
我有一个叫做“vrf”的类。
我有一个输入文件。
当Python遍历这个输入文件的每一行时,每次看到单词vrf时,我都想创建一个以下一个单词命名的对象。
因此,如果它读取“ip vrf TESTER”行, 我想动态创建一个名为TERTER类型vrf的对象。
TESTER = vrf()
我在世界上怎么做到这一点?
我已经试过:
line.split()[2] = vrf()
不工作。
答
一般来说,动态创建的变量名是一个坏主意。相反,你应该创建一个字典,其中名称是关键,实例是价值
在你的情况下,它会是这个样子:
objects = {}
...
object_name = line.split()[2]
objects[object_name] = vrf()
然后你就可以访问它为你的榜样这样: objects [“TESTER”] 会给你对应的vrf实例。
答
为什么你不使用字典?
object = {}
object[line.split()[2]] = vrf()
答
的globals()
字典可以编辑要做到这一点:
>>> globals()['TEST'] = vrf()
>>> type(TEST)
# <class 'vrf'>
答
什么你想要做的是不是一个好主意,改为使用字典,或者如果你的对象有一个存储名称信息的实例变量(如name
)将数据绑定到那里。
objs = {}
objs[line.split()[2]] = vrf()
或(如果有)
v = vrf(line.split()[2])
v = vrf(); v.name = line.split()[2]
输出示例:
print objs
>>> {'vrf' : <__main__.vrf instance at 0x7f41b4140a28>}
为什么不干脆使用字典做? – Julien
一个破解是'globals()[line.split()[2]] = vrf()',但dict解决方案更好,因为直接修改'globals'(或'locals')不是很理智。 – alexpeits
建议阅读:[_你为什么不想动态创建变量_](http://stupidpythonideas.blogspot.com/2013/05/why-you-dont-want-to-dynamically-create.html)和[_Keep数据超出你的变量名称_](http://nedbatchelder.com/blog/201112/keep_data_out_of_your_variable_names.html)。我将添加“将语言标签保留在问题标题之外”。 – martineau