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

Python类中__str__方法未正常工作问题求助(Blackjack开发场景)

PlayerHand类__str__方法未按预期工作的问题排查与修复

我是Python类开发新手,正在制作文本版Blackjack以熟悉类的使用。目前遇到的核心问题是__str__方法未按预期运行:Deck类中的__str__可正常工作,但PlayerHand类中的该方法却返回对象类型而非预期内容。我尝试过多种格式写法,也将输出内容转为字符串,但均无效。相关代码及运行结果如下:

导入与常量定义

import random

card_suits = ['Hearts','Spades','Clubs','Diamonds']

card_names = ['Ace','Two','Three','Four','Five','Six','Seven','Eight',
              'Nine','Ten','Jack','Queen','King']

Deck类代码

class Deck:
    
    def __init__(self):
        pass
        
    def shuffled_deck(self):
        #Make new Deck and shuffle when class instance is called
        initial_deck = []
        for suit in card_suits:
            for name in card_names:
                initial_deck.append(Card(name,suit))
                random.shuffle(initial_deck)
        self.initial_deck = initial_deck
    
    def remove_card(self):
        removed = []
        removed = self.initial_deck.pop()
        self.removed = removed
        return self.removed
        
    def __str__(self):
        return str(self.removed)

PlayerHand类代码

class PlayerHand(Deck):
    
    def __init__(self):
        pass
    
    #Deal cards
    def p1(self):
        p1_hand = []
        for card in [0,1]:
            p1_hand.append(Deck.remove_card(self))
            self.p1_hand = p1_hand
        return self.p1_hand
    
    
   
    def __str__(self):
        return str(self.p1_hand[0])

主程序代码

Current_Hand = PlayerHand()
Current_Hand.shuffled_deck()
Current_Hand.p1()
print(PlayerHand)

当前输出

<class '__main__.PlayerHand'>

核心错误原因

你打印的是类本身(PlayerHand),而非类的实例对象(Current_Hand)。__str__方法只有在打印类的实例时才会被触发,直接打印类会返回类的类型信息,这就是你看到<class '__main__.PlayerHand'>的根本原因。

其他潜在问题及修复

  1. 缺失Card类定义:代码中调用了Card(name,suit)但未定义该类,运行时会抛出NameError。需要补充Card类实现,让卡片能正确显示文本:
class Card:
    def __init__(self, name, suit):
        self.name = name
        self.suit = suit
    
    def __str__(self):
        return f"{self.name} of {self.suit}"
  1. 继承逻辑不合理:PlayerHand不需要继承Deck,两者是独立概念(牌组是发牌源,手牌是卡片集合),用组合替代继承更符合逻辑:
# 优化后的PlayerHand类(组合方式)
class PlayerHand:
    def __init__(self, deck):
        self.deck = deck
        self.hand = []
    
    def deal_initial(self):
        # 发初始两张牌
        for _ in range(2):
            self.hand.append(self.deck.remove_card())
        return self.hand
    
    def __str__(self):
        # 显示所有手牌,而非仅第一张
        return ", ".join(str(card) for card in self.hand)
  1. Deck洗牌逻辑低效:原代码每添加一张卡片就洗牌一次,应先构建完整牌组再洗牌:
# 优化后的Deck.shuffled_deck方法
def shuffled_deck(self):
    initial_deck = [Card(name, suit) for suit in card_suits for name in card_names]
    random.shuffle(initial_deck)
    self.initial_deck = initial_deck

修正后的主程序

将print(PlayerHand)改为print(Current_Hand),触发实例的__str__方法:

# 补充Card类后运行
Current_Hand = PlayerHand()
Current_Hand.shuffled_deck()
Current_Hand.p1()
print(Current_Hand)

如果使用优化后的组合写法,主程序应改为:

deck = Deck()
deck.shuffled_deck()
current_hand = PlayerHand(deck)
current_hand.deal_initial()
print(current_hand)

内容的提问来源于stack exchange,提问作者vishal Dhanda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:35:37