2016-12-11 3 views
0

В настоящее время я работаю над игрой в блэкджек, и, поскольку у меня в настоящее время он структурирован, у меня есть класс рук, который является списком объектов Карты, и я пытаюсь ссылаться на конкретный карты в руке.Объект «Рука» не поддерживает индексирование

def get_move(self): 
    if self.balance > self.bet and not self.isSplit: 
     if self.hand[0].point == self.hand[1].point: 

Проблема возникает в этой третьей строке. Я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "driver.py", line 126, in <module> 
    player.get_move() 
    File "/home/ubuntu/workspace/finalproject/human_player.py", line 29, in get_move 
    if self.hand[0].point == self.hand[1].point: 
TypeError: 'Hand' object does not support indexing 

Почему он не пропускает мой указатель через Руку? Вот конструктор моего класса рук:

class Hand: 
    def __init__(self): 
     self.hand = [] 

EDIT: Я создавать объекты рук для каждого из игроков в моем основном методе:

# creating the dealer for the game  
dealer_hand = hand.Hand() 
dan_the_dealer = dealer.Dealer(dealer_hand) 

# for however many players you start with, add each new player to an array of players 
for i in range(num_players): 
    player_name = input("\nWhat is Player %i's name?\n" % (i+1)) 
    new_hand = hand.Hand() 
    new_player = human_player.HumanPlayer(player_name, starting_balance, 0, new_hand) 
    players.append(new_player) 
+0

Возможно, вы не переопределяете 'hand' для объекта' Hand' где угодно? – Iluvatar

+0

Это сообщение об ошибке указывает, что 'self.hand' является объектом' Hand', а не списком. Ничто в коде, который вы показали, не приведет к тому, что это произойдет. Таким образом - проблема заключается в коде, который вы не показываете. Поскольку вы не показываете код, содержащий ошибку, мало кто может сделать, чтобы помочь. –

+0

Я так не верю. Если бы я искал признак этого, как бы это выглядело? – macschmidt33

ответ

1

Вам нужно определить метод Dunder GetItem как так

def __getitem__(self, item): 
    return self.hand[item] 

в противном случае, при попытке доступа к индексу объекта, интерпретатор Python на самом деле не знаю, что вы хотите сделать.

не мешало бы также определить Dunder SetItem тоже так, что, когда вы попробуете это:

h = Hand() 
h[0] = 1 

интерпретатор также будет необходимо получить доступ к методу __setitem__ Dunder для выполнения операции.

Эти методы уже определены в встроенном объекте list, поэтому вы можете легко его индексировать.
Вы можете попытаться унаследовать их от класса list. Это зависит от вас, но пример начнется следующим образом:

class Hand(list): 
    ... 
+0

Это сработало отлично, спасибо! Раньше я подумывал о создании метода «get_card», но я забыл о методах dunder. – macschmidt33

Смежные вопросы