Python 如何为一个类创建n个实例?
我试图编写一个代码,通过它我可以设置一个变量,比如n,为那个特定的类创建n个实例。实例必须命名为“Node_1”、“Node_2”…“Node_n”。我曾尝试使用for循环以多种方式实现这一点,但我总是会遇到错误:“无法分配给运算符。” 我最近的努力如下:Python 如何为一个类创建n个实例?,python,oop,Python,Oop,我试图编写一个代码,通过它我可以设置一个变量,比如n,为那个特定的类创建n个实例。实例必须命名为“Node_1”、“Node_2”…“Node_n”。我曾尝试使用for循环以多种方式实现这一点,但我总是会遇到错误:“无法分配给运算符。” 我最近的努力如下: class C(): pass for count in range(1,3): "node"+str(count)=locals()["C"]() print(node) 我知道“node”+str(count)是不可能
class C():
pass
for count in range(1,3):
"node"+str(count)=locals()["C"]()
print(node)
我知道“node”+str(count)
是不可能的,但我不知道如何解决这个问题
在这件事上的任何帮助都将不胜感激。你可以做你想做的事,但这真是个坏主意。您应该使用列表
或目录
;由于您似乎希望名称为nodeX
,并且从1
开始,因此应该使用dict
nodes = {'node{}'.format(x): C() for x in range(1, 3)}
from collections import defaultdict
nodes = defaultdict(C)
print(nodes['node1'])
nodes['node2'].method()
print(nodes['anything-can-go-here'])
根据所做的工作,您还可以使用defaultdict
nodes = {'node{}'.format(x): C() for x in range(1, 3)}
from collections import defaultdict
nodes = defaultdict(C)
print(nodes['node1'])
nodes['node2'].method()
print(nodes['anything-can-go-here'])
但是,一旦您这样做,就不需要使用
'node'
前缀。您正在尝试为字符串赋值。您可以编写节点1=C()
,但是节点1=C()
没有意义,因为节点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()
。。。然后可以像这样访问值:
节点[1]
,节点[2]
,等等。创建多个类似对象的最佳模式是列表
理解:
class C():
pass
nodes = [C() for i in range(3)]
这就给您留下了三个类为
C
的对象,它们存储在名为节点的列表中。通过索引(例如,节点[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',),('node_1',),('node_2',)])将它们放在列表中,而不是单独的变量中。有什么原因不能使用字典吗?“可变变量”不是一个好主意。你需要从1开始计数吗?我猜的“节点”
前缀仅仅是一个人工制品。列表
可能是最好的选择,因为它会将类似于节点['node2']
的东西变成节点[2]
。这并不能解决整洁地创建这些实例的问题。如果我们想创建其中五个对象呢?50? 500?对,但一个简单的for循环将创建这n个对象,类将“命名”每个实例,可以通过C.instances[node_x]访问!抛弃冗余变量,采用基于零的索引。:)