2016-08-04 81 views
1

我无法在任何地方找到答案。创建从字符串命名的类对象实例?

我有一个叫做“vrf”的类。

我有一个输入文件。

当Python遍历这个输入文件的每一行时,每次看到单词vrf时,我都想创建一个以下一个单词命名的对象。

因此,如果它读取“ip vrf TESTER”行, 我想动态创建一个名为TERTER类型vrf的对象。

TESTER = vrf() 

我在世界上怎么做到这一点?

我已经试过:

line.split()[2] = vrf() 

不工作。

+1

为什么不干脆使用字典做? – Julien

+0

一个破解是'globals()[line.split()[2]] = vrf()',但dict解决方案更好,因为直接修改'globals'(或'locals')不是很理智。 – alexpeits

+0

建议阅读:[_你为什么不想动态创建变量_](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

回答

2

一般来说,动态创建的变量名是一个坏主意。相反,你应该创建一个字典,其中名称是关键,实例是价值

在你的情况下,它会是这个样子:

objects = {} 
... 
object_name = line.split()[2] 
objects[object_name] = vrf() 

然后你就可以访问它为你的榜样这样: objects [“TESTER”] 会给你对应的vrf实例。

1

为什么你不使用字典?

object = {} 
object[line.split()[2]] = vrf() 
0

globals()字典可以编辑要做到这一点:

>>> globals()['TEST'] = vrf() 
>>> type(TEST) 
# <class 'vrf'> 
0

什么你想要做的是不是一个好主意,改为使用字典,或者如果你的对象有一个存储名称信息的实例变量(如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>}