Python,.append()和AttributeError

时间:2012-09-06 00:50:19

标签: python append attributeerror

我正在尝试编写一个二十一点程序,但是当我尝试从我的deck对象发送一条消息到另一个使用.append()的对象时,我不断得到一个AttributeError:对象没有'append'

以下是我认为相关的代码:

class Deck(Hand):

    def deal(self, players, per_hand= 1):
        for rounds in range(per_hand):
            for hand in players:
                if self.hand:
                    top_card = self.hand[0]
                    self.give(top_card,hand)

players参数是我使用实例化的对象的元组:

class Bj_player(Player,Hand):

    def __init__(self,name,score= 0,status= None):
        self.name = name
        self.score = score
        self.status = status
        self.hand = Hand()

Player基类中没有任何内容,只有来自用户的一些输入。以上是我弄错了吗?

class Hand(object):
"""a hand of cards"""


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

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


    def give(self,card,other_hand):
        if self.hand:
            self.hand.remove(card)
            other_hand.add(card)
        else:
            print("EMPTY ALREADY. COULD NOT GIVE")

我拿出 str 部分将其删除。我得到的错误是:

 line 44, in add
    self.hand.append(card)
    AttributeError: 'Hand' object has no attribute 'append'

我很新,所以越简单解释越好。感谢。

另外,为了防止它有用,这就是我开始的方式:

deck = Deck() #populated and all that other stuff

total_players = Player.ask_number("How many players will there be? (1-6): ",1,6)
for player in range(total_players):
    name = input("What is the player's name? ")
    x = Bj_player(name)
    roster.append(x)

deck.deal(roster,2) #error =(

3 个答案:

答案 0 :(得分:1)

问题在于:

        self.hand = Hand()

Bj_player级内。这使得self.hand变量成为Hand实例,而不是应该是列表。 roster是这些BJ_player个实例的列表,因此当您致电deck.deal(roster)并在函数中显示for hand in players时,每个hand个对象都将是这些Bj_player个实例。

解决此问题的最佳方法是Bj_player 而非hand继承。 (实际上,不清楚为什么你从Player继承它,或者Player类提供了什么有用的功能)。相反,让Bj_player成为自己的类(可能名为Player而不是混淆)并更改行

    for hand in players:
        if self.hand:
            top_card = self.hand[0]
            self.give(top_card,hand)

    for player in players:
        if self.hand:
            top_card = self.hand[0]
            self.give(top_card,player.hand)

单独注意:如果您将self.hand更改为self.cards,则会使 lot 更清晰!

答案 1 :(得分:0)

例如,

a=[1,2,3]
a.append(4)

将产生:

a=[1,2,3,4]

a=a.append(4)将返回 NonType 对象。无法处理此对象。

所以会得到属性错误

答案 2 :(得分:-2)

确保您的变量都是“手”(小写)而不是“手”(大写)。如果查看错误,则错误是“Hand”(大写)没有属性追加。因此,在某些时候,您要么尝试将某些内容附加到Hand类,要么将变量hand设置为Hand类。 (注意每个的大小写)。常见的错误,它发生在我们所有人身上。快乐的编码!