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));

これは、「ボード」オブジェクトを作成したときに得られるものです:

最初の部分出力 (スロットを作成し、Board コンストラクターに追加):

>>> 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]
- 

9 つのオブジェクトすべてについて同様です。2 番目の部分の出力 (リスト内の各オブジェクトに対して 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」を Board オブジェクトに戻すようにしました。それでも、単一のオブジェクトの結果がすべて出力されます。助けていただければ幸いです。ありがとうございました。

[編集] ファイルの完全なコード: インデントが正しく表示されることを願っています

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;
4

1 に答える 1

0

Pavel がコメントで述べているように、クラス レベルで定義されたものはすべてクラス変数であり、すべてのインスタンス間で共有されます。__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-->+

ここには、非常に一義的な Python の例がかなりあることも知っておく必要があります。たとえば、Board 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ます。

于 2013-03-03T18:24:04.570 に答える