Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何为一个类创建n个实例?_Python_Oop - Fatal编程技术网

Python 如何为一个类创建n个实例?

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)是不可能

我试图编写一个代码,通过它我可以设置一个变量,比如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)
是不可能的,但我不知道如何解决这个问题

在这件事上的任何帮助都将不胜感激。

你可以做你想做的事,但这真是个坏主意。您应该使用
列表
目录
;由于您似乎希望名称为
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]访问!抛弃冗余变量,采用基于零的索引。:)