Python:如何在Table类方法中访问Deck类实例的deck变量
解决Table类访问Deck实例属性的问题
嘿,我来帮你搞定这个AttributeError的问题!
错误原因分析
你现在写的self.onTheTable = Deck.deck[:num]是在试图访问Deck类本身的deck属性,但实际上deck是Deck类的实例属性——只有当你创建了Deck的对象(比如代码里的deck = Deck()),这个具体的对象才会拥有deck列表,而Deck类本身并没有这个属性,所以才会报错。
两种可行的修改方案
方案1:给howManyCards方法传入Deck实例
直接把你已经创建好的deck实例作为参数传给howManyCards,这样就能访问到实例的deck属性了:
class Table(): def __init__(self): self.onTheTable = [] def howManyCards(self, num, deck_instance): # 取出前num张牌到桌面 self.onTheTable = deck_instance.deck[:num] # 可选:如果需要模拟真实发牌,从牌堆移除已发的牌 deck_instance.deck = deck_instance.deck[num:]
调用的时候改成这样:
deck = Deck() deck.createDeck() table = Table() table.howManyCards(10, deck) # 传入已创建的deck实例
方案2:在Table初始化时绑定Deck实例
如果你的Table对象一直和同一个Deck关联,可以在初始化Table的时候就把Deck实例传进去,保存为Table的属性,这样后续调用方法就不用每次传参数了:
class Table(): def __init__(self, deck_instance): self.onTheTable = [] self.associated_deck = deck_instance # 保存Deck实例的引用 def howManyCards(self, num): self.onTheTable = self.associated_deck.deck[:num] # 可选:移除牌堆中的已发牌 self.associated_deck.deck = self.associated_deck.deck[num:]
调用方式修改为:
deck = Deck() deck.createDeck() table = Table(deck) # 初始化时传入Deck实例 table.howManyCards(10)
完整测试代码(方案1)
class Card: def __init__(self, figure, colour): self.colour = colour self.figure = figure def __repr__(self): return str(self.figure) + str(self.colour) class Deck: def __init__(self): self.deck = [] def createDeck(self): for colour in ["h", "d", "c", "s"]: for figure in ["2", "3", "4", "5", "6", "7", "8", "9", "T", "J", "Q", "K", "A"]: self.deck.append(Card(figure, colour)) class Table(): def __init__(self): self.onTheTable = [] def howManyCards(self, num, deck_instance): self.onTheTable = deck_instance.deck[:num] deck_instance.deck = deck_instance.deck[num:] # 运行测试 deck = Deck() deck.createDeck() table = Table() table.howManyCards(10, deck) print("桌面的10张牌:", table.onTheTable) print("牌堆剩余牌数:", len(deck.deck)) # 输出42,因为52-10=42
内容的提问来源于stack exchange,提问作者Karollo
相关产品推荐
相关产品推荐

