尝试实例化同一个类的多个实例

时间:2016-12-23 20:49:32

标签: python

我编写了一个教育游戏,用户必须重现计算机提供的工厂。 我的问题是:

我有一个字符串类,其中有一个类" __ 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>]

photo of the interface

你可以帮帮我吗? :&#39;(

1 个答案:

答案 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]()