我正在尝试编写一个二十一点程序,但是当我尝试从我的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 =(
答案 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类。 (注意每个的大小写)。常见的错误,它发生在我们所有人身上。快乐的编码!