如何为类创建n个实例?

时间:2015-08-26 21:46:26

标签: python oop

我正在尝试编写一个代码,我可以设置一个变量,比如n,为该特定类创建n个实例。实例必须命名为“Node_1'”,“Node_2' ...' Node_n'”。我尝试使用for循环以多种方式执行此操作,但我始终收到错误:'无法分配给运营商。'

我最近的努力如下:

"node" + str(count)

我理解{{1}}是不可能的,但我不知道如何解决这个问题。

对此事的任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:3)

可以做你想做的事,但这是一个非常糟糕的主意。您应该使用listdict;由于您似乎希望名称为nodeX,并且从1开始,您应该使用dict

nodes = {'node{}'.format(x): C() for x in range(1, 3)}

根据您正在做的事情,您还可以使用defaultdict

from collections import defaultdict

nodes = defaultdict(C)

print(nodes['node1'])

nodes['node2'].method()

print(nodes['anything-can-go-here'])

一旦你这样做,就不需要'node'前缀。

答案 1 :(得分:1)

创建几个类似对象的最佳模式是on2理解:

on1

这会留下三个类list的对象,存储在名为class C(): pass nodes = [C() for i in range(3)] 的{​​{1}}中。使用索引(例如C)以正常方式访问每个对象。

答案 2 :(得分:0)

您正在尝试为字符串分配值。您可以编写Node_1 = C(),但"Node_1" = C()无意义,因为"Node_1"是字符串文字,而不是标识符。

这有点粗略,但您可以使用locals()字典按名称访问标识符:

for count in range(1, 3):
    locals()["node" + str(count)] = C()

...并且,完成后,您可以使用node1node2,就好像它们已在您的代码中明确定义一样。

然而,通常情况下,最好不要以这种方式访问​​您的本地人,而应该使用您自己创建的单独字典,该字典独立存在并包含值:

nodes = {}
for count in range(1, 3):
    nodes[count] = C()

...然后可以像这样访问这些值:nodes[1]nodes[2]等。

答案 3 :(得分:0)

我喜欢做什么,保留一个类的所有实例的注册表:

class C(object):
    instances = {}

    def __new__(cls, *args, **kwargs):
        instance = super(C, cls).__new__(cls, *args, **kwargs)
        instance_name = 'node_{}'.format(len(cls.instances))
        cls.instances[instance_name] = instance
        return instance


if __name__ == '__main__':
    for _ in range(3):
        C()

    print C.instances

OrderedDict([' node_0',< .C对象位于0x10c3fe8d0>),(' node_1',< main .C对象位于0x10c4cb610>),(' node_2',< .C对象位于0x10c4e04d0>)])