Python中使用__str__/__repr__方法打印类内部列表格式异常问题咨询
问题原因解析
- 执行
print(deck2)时,触发的是Deck类的__str__方法,你在方法内手动遍历了所有牌,逐张调用PlayingCard实例的__str__方法做了格式化,所以输出符合预期。而执行print(deck2.cards)是直接打印列表对象,Python处理列表输出时,会自动调用列表内每个元素的__repr__魔法方法,你仅给PlayingCard实现了__str__,没有实现__repr__,所以会输出默认的对象内存地址格式。 - 你当前的
shuffle_deck方法操作的是Deck类的公共类变量deck_cards,根本没有修改实例自身的cards属性,所以哪怕调整了输出格式,cards列表的顺序也不会随洗牌操作变化。另外类变量deck_cards是所有Deck实例共享的,每次新建实例都会重复往里面追加牌,会出现数据污染的问题。 - 原代码缺少
import random导入,直接运行会报错。
修复方案
- 给
PlayingCard类补充__repr__方法,直接复用已有的__str__逻辑即可:
class PlayingCard(): # 原有代码保持不变 def __str__(self): return self.rank+" of " +self.suit # 新增这一行即可 __repr__ = __str__
- 修正
Deck类的类变量问题、洗牌逻辑和参数冲突问题:
import random class Deck(): ranks=[2,3,4,5,6,7,8,9,10,'J','Q','K','A'] def __init__(self, suits = ['♥','♦','♣','♠']): self.suits = suits # 把deck_cards改为实例变量,避免不同实例数据互相污染 self.deck_cards=[] for rank in Deck.ranks: for suit in self.suits: card = PlayingCard(rank,suit) self.deck_cards.append(card) self.cards=[] # 修复变量名冲突问题,避免循环变量覆盖传入的花色参数 target_suit = suits if isinstance(suits, str) else suits[0] for card in self.deck_cards: if card.get_suit() == target_suit: self.cards.append(card) def shuffle_deck(self): # 洗牌改为操作实例自身的cards列表 random.shuffle(self.cards) def deal_card(self,count): deal_cards = [] if count <= len(self.cards): deal_cards = random.sample(self.cards,count) for card in deal_cards: self.cards.remove(card) deal_card_str='' for card in deal_cards: deal_card_str += str(card)+", " print(deal_card_str[:-2]) else: print(f'Cannot deal {count} cards. The deck only has {len(self.cards)} cards left!') def __str__(self): full_deck='' for card in self.cards: full_deck += str(card)+", " return full_deck[:-2]
修复后执行测试代码,print(deck2.cards)就会输出和print(deck2)格式一致的内容。
内容的提问来源于stack exchange,提问作者user12407401
相关产品推荐
相关产品推荐

