4

我想在循环中创建类实例。所有实例都需要分配给不同的变量。这些变量可以是一系列字母,例如 [a,b,c]。

class MyClass(object):
    pass

for i in something:
    #create an instance

如果循环转了 3 次,我希望循环做出这样的事情:

a = MyClass()
b = MyClass()
c = MyClass()

有没有办法做到这一点?

4

6 回答 6

9

以这种方式使用自变量名称有点奇怪。如上所示,使用字典或列表似乎更好。

把它从中间分开,怎么样

a,b,c = (MyClass() for _ in range(3))
于 2012-05-20T14:30:16.823 回答
2

您可以使用exec. 另请参阅在 Python 中修改本地变量

>>> class Foo(object): pass
... 
>>> for name in "abc":
...     exec "{0} = Foo()".format(name)
... 
>>> a
<__main__.Foo object at 0x10046a310>
>>> b
<__main__.Foo object at 0x10046a390>
>>> c
<__main__.Foo object at 0x10046a3d0>
于 2012-05-20T14:12:06.217 回答
1

您可以创建一个包含所有实例的列表。例如:

instances = [MyClass() for i in range(0, N)]
于 2012-05-20T14:12:04.333 回答
1

不容易,做这样的事情通常是个坏主意。其他人可以详细说明原因,因为我不太清楚。

你可能会做的是

class MyClass(object):
    pass

list_of_insts = []
for i in something:
    #create an instance
    lists_of_insts.append(MyClass())

然后您可以在该列表中按位置引用每个:lists_of_insts[0]. 您还可以将它们分配给 adict而不是列表,以便于访问。

于 2012-05-20T14:12:10.903 回答
1

您可以有一个要命名对象的名称列表,然后在循环中,在创建和命名对象时将名称添加到全局命名空间。

list_of_names = ['a', 'b', 'c', 'd']
for name in list_of_names:
    globals()[name] = your_object()

这里的人肯定会说这是一种不好的编码方式,没有给出任何令人信服的理由,但它直接解决了你的问题,没有任何进一步的列表或字典。

于 2012-05-20T14:12:40.740 回答
0

将这些变量存储在字典中怎么样?像

variables = {}
varnames = ['a', 'b', 'c']
for i, something in enumerate(things):
    variables[varnames[i]] = MyClass()
于 2012-05-20T14:12:12.590 回答