2017-09-29 69 views
2

从名称和类列出了许多不同类型的我有这样的名单:如何在Python中实例

names = ['name_1', 'name_2', ..., 'name_n'] 

和类的列表(类名)是这样的:

classes = ['class_1', 'class_2', ..., 'class_n'] 

我可以实例化每个类是这样的:

name_1 = class_1() 

我如何可以实例的所有类具有给定名称在上ce(也许使用for循环)?

+4

通常有更好的方法来解决这个问题是什么问题,你正在试图解决的问题。动态变量名称几乎从未是正确的解决方案。你是否有理由将类名称作为字符串,而不是实际类的列表?是否有理由需要动态创建变量名称而不是将实例存储在字典中? –

+0

阅读您对答案的评论后,我怀疑这可能是[XY-问题](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。你可能想问一个关于**真正问题**的新**问题,而不是关于你的**尝试**来解决它。 :) – MSeifert

+0

我试图避免这个陷阱。我试图从一个模块立即实例化所有类。 – GGG

回答

5

为什么你要存储类的名称而不是类本身?

你可以轻松存储类,而不是类名:

classes = [class1, class2] 

然后用

[cls() for cls in classes] 

要创建的实例。

但是动态变量名很少是个好主意,为什么不把它们存储在字典中呢?

d = {name: cls() for name, cls in zip(names, classes)} 

,然后访问d['name_1']获得实例'name_1'

如果您无法解决类名称问题列表,也可以使用字典解决方案。您只需创建一个字典,名称映射到实际的类:

name_to_class = {'class_1': class_1, 'class_2': class_2, ...} 

d = {name: name_to_class[cls]() for name, cls in zip(names, classes)} 

你可以做要通过globals或类似简单,但是这是一个非常不好的习惯,会暴露一切(安全风险)。使用自己的字典通常被认为是更“合适的方式”。

+0

我只有一个类名称列表。我应该如何存储这些类呢? – GGG

+0

@GGG我更新了答案。 – MSeifert

+0

我试着就像你所描述的,得到这个:NameError:name'name_1'没有定义 – GGG

0

虽然不是推荐的事,只是为了演示的目的在这里你去

for index in range(len(names)): 
    name = names[index] 
    klass = classes[index] 

    vars()[name] = vars()[klass]() 
+0

至少你没有使用'eval' ...然而,使用'vars()','locals()'和'globals()'还是很麻烦...... – MSeifert

+0

@MSeifert我写了一个一开始就是一种免责声明。我不是吗? – hspandher

+0

你说得对。我只是解释我认为“不推荐”的内容。 – MSeifert