Не удается добавить объект к переменной экземпляра (list)

#python #class #oop #object #instance

#python #класс #ооп #объект #экземпляр

Вопрос:

Я пытаюсь изучить Python и пытаюсь создать игру в блэкджек. Я создал Person класс, в котором у него есть вызываемая переменная экземпляра self.hand . self.hand это пустой список, который должен содержать 2 начальные карты, и оттуда любой игрок, которому нужна карта, получит карту с помощью метода append. Однако у меня это по какой-то причине не работает. Кто-нибудь, пожалуйста, помогите, это беспокоит меня уже несколько дней!!

Я уже пытался создать get_add_card (получить дополнительную карточку) метод экземпляра и попытался вручную добавить новый объект card в список раздач persons. Ничего не сработало.

Первый фрагмент кода — это Person класс. В этом классе я определяю self.hand как список, в котором изначально будут храниться 2 объекта card ( get_cards ). После этого я создал другой метод, который при необходимости должен добавить другую карточку в список. Второй блок кода должен проверить, кому нужна карточка, а затем добавить случайную карточку к этому списку конкретных лиц.

 class Person:
    def __init__(self, name):
        self.name = name
        self.hand = []
        self.get_cards()

    def get_cards(self):
        for i in range(2):
            rand_card = random.choice(Deck.cards)
            self.hand.append(rand_card)
            Deck.cards.remove(rand_card)

    def get_add_card(self):
        self.hand.append(random.choice(Deck.cards))

need_card = True
while need_card:
    answer = input("Does anyone need a card? Yes or No")
    if answer.lower() == 'no':
        need_card = False
    elif answer.lower() == 'yes':
        player_need = input("Which player needs a card?").lower()
        Person(player_need).get_add_card()
        print (Person(player_need).hand)
    else:
        print("Please answer using yes or no")
  

Код должен добавить случайную карту в список раздач людей. Однако этого не происходит, и когда я пытаюсь распечатать их руку в конце, это показывает только, что это две карты, с которыми человек начал в начале.

Комментарии:

1. Пожалуйста, сделайте правильный отступ в своем коде.

2. Добавьте обратные метки («) до и после вашего блока кода. Кроме того, почему существуют player_need и a need_player ?

3. @gmds, нет, не добавляйте обратные ссылки. Просто добавьте пробелы по мере необходимости.

4. я только что сделал отступ, пожалуйста, проверьте это сейчас

5. Вам нужно сделать отступ во всем коде на дополнительные четыре пробела. {} Кнопка в редакторе сделает это за вас, если вы выделите весь код после того, как вставите его.

Ответ №1:

Ваша проблема в том, что каждый раз, когда вы это делаете Person(need_player) , вы создаете отдельный Person объект. Даже если вы используете тот же самый name объект, это не тот же объект, что и раньше, и у него будет отдельный список в качестве hand атрибута.

Чтобы избежать повторного создания ваших проигрывателей снова и снова, вы должны создать их заранее и поместить в список или словарь:

 # up front, create the players (perhaps by prompting, but here hard-coded)
players = {"alice": Person("Alice"), "aob": Person("Bob")}

# later, you can look them up by name:
player_need = input("Which player needs a card?").lower()
players[player_need].get_add_card()
print(players[player_need]).hand)
  

Вероятно, вам понадобится немного больше логики, чтобы избежать ошибок, если пользователь вводит неизвестное имя, но это должно дать вам общее представление.