我编写了一个教育游戏,用户必须重现计算机提供的工厂。 我的问题是:
我有一个字符串类,其中有一个类" __ machines"的属性。这是一个值为类的字典。 当我使用setConfMachine()方法时,我想改变机器的配置,使其形成不同的厚度线或不同数量的孔。问题是,当我配置机器时,它还配置了所有相同类型的机器,因为我相信相同类型的机器是相同的对象。
这里有机器对象列表
other(force_reload=false)
[<Machine.MTrou object at 0x101c586a0>, <Machine.MRoue object at 0x101c58710>, <Machine.MPassive object at 0x101c58630>, <Machine.MPassive object at 0x101c58630>, <Machine.MPassive object at 0x101c58630>, <Machine.MPassive object at 0x101c58630>, <Machine.MPassive object at 0x101c58630>, <Machine.MPassive object at 0x101c58630>, <Machine.MPassive object at 0x101c58630>, <Machine.MPassive object at 0x101c58630>, <Machine.MPassive object at 0x101c58630>]
你可以帮帮我吗? :&#39;(
答案 0 :(得分:0)
问题是经典的“实例副本”:
__ machines = {0:MPassive(),1:MTrou(),2:MTrait(),3:MRoue()}
def __init__(self,nbMachines):
list.__init__(self)
self.nbMachines=nbMachines
self.chaine=[self.getMachines()[0] for i in range(self.nbMachines)]
此列表comp不会避免实例重复,因为调用返回相同的引用:
[self.getMachines()[0] for i in range(self.nbMachines)]
(你以为你避免使用古典[self.getMachines()[0]]*self.nbMachines
,但结果是一样的)
你想这样做:
# dictionary of classes, not instanciated objects (note the lack of ())
__machines = {0: MPassive, 1: MTrou, 2: MTrait, 3: MRoue}
def __init__(self,nbMachines):
list.__init__(self)
self.nbMachines=nbMachines
# instantiate your objects in the list comprehension: not the extra `()`
self.chaine=[self.getMachines()[0]() for i in range(self.nbMachines)]
现在__machines
是 classes 的字典,并且实例化在列表解析中完成了几次,因此引用是不同的,就像你想要的那样。
注意:还必须调整setMachine
以实例化类:
def setMachine(self,i,type=0):
print(self.chaine)
self.chaine[i]=self.getMachines()[type]()