2013-03-03 32 views
0

这是我第一次在这里发布,也是我对Python的新手,所以如果我有什么问题请耐心等待!我看到了类似的问题,但看不到明确的解决方案。这必须有一个简单的解决方案,但它让我整天感到沮丧。变量对于构造函数中所做的同一类型的所有对象都引用同一个对象

我正在试图在类'Board'的构造函数 中创建'Slot'类的多个对象。每个对象创建后,我将它附加到列表中。 最后,我正在浏览列表中的每个对象并调用'getHandles'方法,该方法应该输出其独特结果 。而是显示最后一个槽对象的结果。

板类的构造函数:

class Board: 
slots = [] 

def __init__(self): 
    slot1 = Slot(1); self.slots.append(slot1); 
    slot2 = Slot(2); self.slots.append(slot2); 
    slot3 = Slot(3); self.slots.append(slot3); 
    slot4 = Slot(4); self.slots.append(slot4); 
    slot5 = Slot(5); self.slots.append(slot5); 
    slot6 = Slot(6); self.slots.append(slot6); 
    slot7 = Slot(7); self.slots.append(slot7); 
    slot8 = Slot(8); self.slots.append(slot8); 
    slot9 = Slot(9); self.slots.append(slot9); 

    print("\nprinting slot objects in list 'slot'\n"); 
    counter = 0; 
    while counter < len(self.slots): 
     print("slot number :"+str(self.slots[counter].getPosition())); 
     print("slot value :"+str(self.slots[counter].getHandles())); 
     counter +=1; 

槽类的构造函数:

#Slot class constructor 
def __init__(self,n): 
    self.setPosition(n); 
    positions = coords.getLargeGridPosition(n); 
    self.U[2] = positions[1]; self.D[2] = positions[2]; 
    self.L[2] = positions[3]; self.R[2] = positions[4]; 

    print("made slot object : "+str(self.getPosition())); 
    print("handle values: "); 
    self.getHandles(); 
    print(" - "); 

def getHandles(self): 
    print(" U:"+str(self.U)+" D:"+str(self.D)+" L:"+str(self.L)+" R:"+str(self.R)); 

这是我所得到的,当我做一个 '公告板' 对象:

第1部分OUT输出(使插槽并添加在电路板构造函数中):

>>> b = Board() 
made slot object : 1 
handle values: 
U:[1, 2, 2] D:[2, 1, 20] L:[3, 4, 10] R:[4, 3, 12] 
- 
made slot object : 2 
handle values: 
U:[1, 2, 5] D:[2, 1, 23] L:[3, 4, 13] R:[4, 3, 15] 
- 
made slot object : 3 
handle values: 
U:[1, 2, 8] D:[2, 1, 26] L:[3, 4, 16] R:[4, 3, 18] 
- 
made slot object : 4 
handle values: 
U:[1, 2, 29] D:[2, 1, 47] L:[3, 4, 37] R:[4, 3, 39] 
- 

等所有九个对象。 第二部分出输出(要求在列表中的每个对象getHandle法):

printing slot objects in list 'slot' 

slot number :1 
U:[1, 2, 62] D:[2, 1, 80] L:[3, 4, 70] R:[4, 3, 72] 
slot value :None 
slot number :2 
U:[1, 2, 62] D:[2, 1, 80] L:[3, 4, 70] R:[4, 3, 72] 
slot value :None 
slot number :3 
U:[1, 2, 62] D:[2, 1, 80] L:[3, 4, 70] R:[4, 3, 72] 
slot value :None 
slot number :4 
U:[1, 2, 62] D:[2, 1, 80] L:[3, 4, 70] R:[4, 3, 72] 
slot value :None 
slot number :5 
U:[1, 2, 62] D:[2, 1, 80] L:[3, 4, 70] R:[4, 3, 72] 

等为所附列出所有9个对象。我怎样才能使变量slot1/slot2 引用个别对象?

我试过将板对象传递给槽构造函数,并使槽构造函数将'self'传递回板对象。仍然输出单个对象的结果。 我会很感激任何帮助。谢谢。

[编辑]文件的全码:希望缩进出来右

import coords; 

#store hanndle position values 

class Slot: #slot class<------------------------------------------------ 

    U = [1,2,"gridPosition"] #1 up 
    D = [2,1,"gridPosition"] #2 down 
    L = [3,4,"gridPosition"] #3 left 
    R = [4,3,"gridPosition"] #4 right 
    handles = [U,D,L,R] #handles 0/1/2/3 

    tileValue = 0; #value 0 - 8 
    tilePosition = 0; #slot 1 - 9 
    overallStrain = 0; # |0-->+ 

    #Slot class constructor 
    def __init__(self,n): 
     self.setPosition(n); 
     positions = coords.getLargeGridPosition(n); 
     self.U[2] = positions[1]; self.D[2] = positions[2]; 
     self.L[2] = positions[3]; self.R[2] = positions[4]; 

     print("made slot object : "+str(self.getPosition())); 
     print("handle values: "); 
     self.getHandles(); 
     print(" - "); 

    def getHandles(self): 
     print(" U:"+str(self.U)+" D:"+str(self.D)+" L:"+str(self.L)+" R:"+str(self.R)); 

    #set/get position of slot(1-9) 
    def setPosition(self,position): 
     self.tilePosition = position; 
    def getPosition(self): 
     return self.tilePosition; 

    #set/get tile value 
    def setTileValue(self,value): 
     self.TileValue = value; 
    def getTileValue(self): 
     return self.TileValue; 

    #get handle(n) position value 
    def getHandle(self,number): 
     return self.handles[number] 

    #get overall strain of tile 
    def getTotalStrain(self): 
     return self.totalStrain; 
    #calculate total strain from strains of handles 
    #def calculateOverallStrain(self):#<--------------- 
     #for handle in handles: 
      #if 


    #get linked tile, 



class Board: #Boardclass<------------------------------------------------ 
    slots = [] 

    def __init__(self): 
     slot1 = Slot(1); self.slots.append(slot1); 
     slot2 = Slot(2); self.slots.append(slot2); 
     slot3 = Slot(3); self.slots.append(slot3); 
     slot4 = Slot(4); self.slots.append(slot4); 
     slot5 = Slot(5); self.slots.append(slot5); 
     slot6 = Slot(6); self.slots.append(slot6); 
     slot7 = Slot(7); self.slots.append(slot7); 
     slot8 = Slot(8); self.slots.append(slot8); 
     slot9 = Slot(9); self.slots.append(slot9); 

     print("\nprinting slot objects in list 'slot'\n"); 
     counter = 0; 
     while counter < len(self.slots): 
      print("slot number :"+str(self.slots[counter].getPosition())); 
      print("slot value :"+str(self.slots[counter].getHandles())); 
      counter +=1; 


    #set tiles 
    def setTiles(self,state): 
     counter = 0; 
     for slot in self.slots: 
      slot.setTileValue(state[counter]); 
      counter +=1; 


    def getStrain(self,slot): 
     tileValue = self.slots[slot].getTileValue(); 
     print("tile value:"+str(tileValue)); 
     print("handles:"); 
     self.slots[slot].getHandles(); 

     if tileValue != 0: 
      linkedTiles = coords.getLinked(tileValue); 
      print(str(linkedTiles)); 

      counter = 0; 
      for l in linkedTiles:#for each linked tile 
       if l != 0: #if not empty link 

        linkedTileSlot = [];#slot linked tile is set in 

        for slot in self.slots: 
         linkedTileValue = slot.getTileValue(); 
         print(str(linkedTileValue)); 
         if l == linkedTileValue:#found slot with linked tile 
          print("yes"); 
          linkedTileSlot = slot; break; 

        ownHandle = slot.getHandle(counter); 
        print("own handle : "+str(ownHandle)); 
        linkingHandle = linkedTileSlot.getHandle(ownHandle[1]-1); 
        print("linking handle : "+str(linkingHandle)); 
        positions = [ownHandle[2],linkingHandle[2]] 
        print(str(positions)); 

       counter += 1; 
+1

向我们展示'Slot'类的其余部分。如果在类上定义了'U','D','L','R',则它们在该类上定义并由所有实例共享。 – 2013-03-03 17:48:03

+0

你的意思是像Java中的静态变量吗?如果有的话,让它们成为实例变量? – kanr 2013-03-03 18:06:03

+0

只是说,你不需要Python中的分号;白色空间决定了代码结构。 – 2013-03-03 20:02:18

回答

0

由于帕维尔在评论中说,在类级别定义什么是一个类变量,所有实例之间共享。你需要通过指定它们来定义内__init__这些变量self

class Slot: #slot class<------------------------------------------------ 
    def __init__(self,n):  
    self.U = [1,2,"gridPosition"] #1 up 
    self.D = [2,1,"gridPosition"] #2 down 
    self.L = [3,4,"gridPosition"] #3 left 
    self.R = [4,3,"gridPosition"] #4 right 
    self.handles = [U,D,L,R] #handles 0/1/2/3 

    self.tileValue = 0; #value 0 - 8 
    self.tilePosition = 0; #slot 1 - 9 
    self.overallStrain = 0; # |0-->+ 

你也应该知道,这里有非常unidiomatic Python中的相当多的例子。例如,整板的init应该简单地:

def __init__(self): 
    self.slots = [Slot(i+1) for i in range(10)] 

    print("\nprinting slot objects in list 'slot'\n"); 
    for slot in self.slots: 
     print("slot number :%s" % slot.getPosition()); 
     print("slot value :%d" slot.getHandles()); 

此外,它气馁定义getter和setter方法,除非有很好的理由,你不必在这里,因为你只是访问变量。您应该分配并返回self.position等。

+0

我明白了。谢谢你们两位! – kanr 2013-03-03 18:36:59

+0

是...自我。句柄= [U,D,L,R]需要改变toself.handles = [self.U,self.D,self.L,self.R] #handles 0/1/2/3,否则它现在完美运行。 ..关于这个奇怪的代码,我没有用过很多Python,并且一直在学习中。我希望变得更好!再次感谢。 – kanr 2013-03-03 18:44:57

相关问题