Python如何正确打印自定义Card类组成的整副扑克牌栈
扑克牌堆打印问题解决方案
问题根本原因
Python 打印列表等容器类型时,会自动调用容器内部元素的__repr__方法输出信息,你当前仅为Card类实现了__str__方法,该方法只在直接打印单个Card对象时生效,因此打印包含Card对象的牌堆列表时会显示默认的内存地址。
可行解决方法
方案1:修改Card类新增__repr__方法(最推荐)
直接复用已有的__str__逻辑作为__repr__的实现,只需要在Card类中新增一行代码即可:
class Card: def __init__(self,suit,rank): self.suit = suit self.rank = rank self.value = values[rank] def __str__(self): return self.rank + ' of ' + self.suit # 新增此行 __repr__ = __str__
修改后直接打印牌堆列表即可得到可读结果:
print(Deck().all_cards) # 输出:['Two of Hearts', 'Three of Hearts', 'Four of Hearts', ... , 'Ace of Clubs']
方案2:不修改类定义,打印时手动转换
如果不想改动原有类代码,打印时用列表推导式把所有Card对象转成字符串后再输出即可:
deck = Deck() print([str(card) for card in deck.all_cards])
方案3:为Deck类新增字符串方法,直接打印牌堆实例
如果需要频繁输出整副牌,可给Deck类添加__str__方法,后续直接打印Deck实例就能逐行显示所有牌:
class Deck: # 原有初始化、洗牌、发牌方法保持不变,新增以下方法 def __str__(self): return '\n'.join(str(card) for card in self.all_cards)
使用效果:
print(Deck()) # 逐行输出所有牌面: # Two of Hearts # Three of Hearts # ... # Ace of Clubs
内容的提问来源于stack exchange,提问作者Namra
相关产品推荐
相关产品推荐

