从父类属性弹出列表未按预期工作问题排查
问题原因及解决方案
核心问题
你创建了两个完全独立的实例:cards和player1_cards,它们各自拥有自己的main_deck牌堆,互相之间没有任何关联。
具体分析
- 执行
cards = PlayingCards()时,初始化了一个包含52张牌的独立牌堆,调用cards.hit()后,这个实例的main_deck减少到51张,所以第一次打印结果是51。 - 执行
player1_cards = PlayerHand()时,由于PlayerHand继承自PlayingCards,它的__init__方法会调用父类的__init__,重新创建一个全新的52张牌的main_deck。调用player1_cards.hit()只会修改它自己的牌堆,和cards的牌堆完全无关,所以第二次打印cards.main_deck的长度仍然是51。
修复方案
要实现共享牌堆的需求,应该让玩家类不继承牌堆类,而是接收一个PlayingCards实例作为共享牌堆,这样所有玩家和发牌者都从同一个牌堆抽牌。修改后的代码如下:
from random import choice class PlayingCards: suits = ['Diamond','Club','Heart','Spade'] numbers = [x for x in range(2,11)] + list('JQKA') def __init__(self): self.main_deck = [[number,suit] for number in self.numbers for suit in self.suits] self.drawn_cards = [] def hit(self): if self.main_deck: drawed_card = self.main_deck.pop(choice(range(len(self.main_deck)))) self.drawn_cards.append(drawed_card) return drawed_card else: return None class PlayerHand: def __init__(self, shared_deck): self.shared_deck = shared_deck # 绑定共享牌堆 self.player_drawn_cards = [] def hit(self): card = self.shared_deck.hit() if card: self.player_drawn_cards.append(card) return card else: return None # 创建唯一的共享牌堆 game_deck = PlayingCards() # 玩家1使用这个共享牌堆 player1 = PlayerHand(game_deck) game_deck.hit() print(len(game_deck.main_deck)) # 输出51 player1.hit() print(len(game_deck.main_deck)) # 输出50,符合预期
这样修改后,所有操作都会作用于同一个game_deck实例的牌堆,抽牌次数会正确反映在牌堆长度上,同时每个玩家也能独立记录自己的抽牌记录。
内容的提问来源于stack exchange,提问作者Jerry Chin
相关产品推荐
相关产品推荐

