我正在尝试编写一个代码,我可以设置一个变量,比如n,为该特定类创建n个实例。实例必须命名为“Node_1'”,“Node_2' ...' Node_n'”。我尝试使用for循环以多种方式执行此操作,但我始终收到错误:'无法分配给运营商。'
我最近的努力如下:
"node" + str(count)
我理解{{1}}是不可能的,但我不知道如何解决这个问题。
对此事的任何帮助将不胜感激。
答案 0 :(得分:3)
你可以做你想做的事,但这是一个非常糟糕的主意。您应该使用list
或dict
;由于您似乎希望名称为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()
...并且,完成后,您可以使用node1
和node2
,就好像它们已在您的代码中明确定义一样。
然而,通常情况下,最好不要以这种方式访问您的本地人,而应该使用您自己创建的单独字典,该字典独立存在并包含值:
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>)])