You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从父类属性弹出列表未按预期工作问题排查

问题原因及解决方案

核心问题

你创建了两个完全独立的实例:cards和player1_cards,它们各自拥有自己的main_deck牌堆,互相之间没有任何关联。

具体分析

  1. 执行cards = PlayingCards()时,初始化了一个包含52张牌的独立牌堆,调用cards.hit()后,这个实例的main_deck减少到51张,所以第一次打印结果是51。
  2. 执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:31:03