面向对象的属性错误编程

时间:2016-04-02 20:37:39

标签: python

这是我的第一个非MATLAB编程语言,所以我在面向对象编程方面遇到了一些麻烦。具体来说,我正在研究一个模拟二十一点游戏的程序。它正在运作,但我尝试添加一些新功能,允许玩家下注

为了推测,BJ Player是一个卡对象集合的对象。 Def_init过去常常只使用self和names作为参数,但我添加了startmonies(玩家正在下注的起始资金。)BJ玩家的超类最终是BJ手。我现在在调用方法向该手添加卡时遇到错误。以下是错误o

class BJ_Game(object):
""" A Blackjack Game. """
def __init__(self, names, startingmonies):      
    self.players = []
    for name in names:
        player = BJ_Player(name)
        spot = names.index(name)
        startingscratch = startingmonies[spot]
        player_with_money = (name, startingscratch,0)
        self.players.append(player_with_money)

这是错误发生的地方(导入上面使用的BJ模块的卡模块):

class Hand(object):
""" A hand of playing cards. """
def __init__(self):
    self.cards = []

def __str__(self):
    if self.cards:
       rep = ""
       for card in self.cards:
           rep += str(card) + "\t"
    else:
        rep = "<empty>"
    return rep

def clear(self):
    self.cards = []

def add(self, card):
    self.cards.append(card)

def give(self, card, other_hand):
    self.cards.remove(card)
    other_hand.add(card)

这是我得到的错误:  第47行,给出     other_hand.add(卡)

AttributeError:&#39; tuple&#39;对象没有属性&#39;添加&#39;

我在尝试交易卡时遇到此错误。之前其他所有工作都是如此,我所做的唯一真正的改变就是添加投注参数。我研究过这个问题并且无法获得强烈的理解。任何帮助将不胜感激。谢谢!

以下是一些更多信息。我认为错误正在发生,因为我改变了self.players是一个元组列表。我不知道如何解决这个问题。

for index, player in enumerate(self.players):
        flag = 1
        while flag:
            try:
                (name, players_cache,bet) = player
                print(players_cache)
                print("Current player:",name)
                bet = int(input("Please select how much this player would like to wager: "))
                if bet <= 0:
                    print("Bet must be greater than 0")
                elif bet <= players_cache:
                    flag = 0
                    players_cache-=bet
                    player = (name,players_cache,bet)
                    self.players[index] = player
                else:
                    print("Insufficient funds. PLayer only has",players_cache,"dollars available")
            except ValueError:
                print("Input must be a number\n")


    # deal initial 2 cards to everyone
    self.deck.deal(self.players + [self.dealer], per_hand = 2)

我在这里得到了另一部分错误。 第169行,在游戏中     self.deck.deal(self.players + [self.dealer],per_hand = 2)

这是完整的错误块。很抱歉没有在以前显示所有内容:

262行,in     主要()   第258行,主要     game.play(max_Cards)    第169行,在游戏中     self.deck.deal(self.players + [self.dealer],per_hand = 2)    第65行,在交易中     self.give(top_card,hand)    第47行,给出     other_hand.add(卡) AttributeError:&#39;元组&#39;对象没有属性&#39;添加&#39;

2 个答案:

答案 0 :(得分:0)

如错误中所示,other_hand必须是元组,因此在这种情况下您不能使用add()。代码不能更改元组,它们必须由制作代码的人直接更改。元组是这样的:

tuple = (var1, var2, ..., varx)

基本上是一个列表但带有括号但不能被代码更改。因此,您必须确保other_hand是一个列表。

答案 1 :(得分:0)

您正在将tuple对象传递给give方法,而不是解释为什么未定义add方法的Hand实例。由于您还没有在代码中提到给出方法的调用,因此我无法将指针指向确切的行。