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'>的根本原因。
其他潜在问题及修复
- 缺失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}"
- 继承逻辑不合理: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)
- 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
相关产品推荐
相关产品推荐

