无法将对象附加到实例变量(列表)

时间:2019-03-24 22:57:36

标签: python class oop object instance

我正在尝试学习python,并试图创建二十一点游戏。我创建了一个Person类,其中有一个名为self.hand的实例变量。 self.hand是一个空列表,应该容纳2张初始卡,并且从那里开始,需要卡的任何玩家都会通过append方法收到一张卡。但是由于某种原因,这对我不起作用。有人请帮助它困扰我好几天了!

我已经尝试创建get_add_card(获取附加卡)的实例方法,并尝试将新的卡对象手动附加到人员名单中。没事。

第一段代码是Person类。在该类中,我将self.hand定义为一个列表,该列表最初将存储2个卡对象(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 个答案:

答案 0 :(得分: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)

如果用户输入一个未知的名称,您可能需要在其中添加一些逻辑以避免错误,但这应该可以为您提供一般的想法。