Python中使用列表推导式打印Fist对象失败,求问题排查与解决
问题:打印Player的fists时显示对象地址而非预期内容
问题现象
打印玩家的fists属性时,输出的是对象内存地址:
[<__main__.Fist object at 0x7f3d73f7e280>, <__main__.Fist object at 0x7f3d73f7e3a0>] [<__main__.Fist object at 0x7f3d73f7e490>, <__main__.Fist object at 0x7f3d73f7e4f0>]
代码问题分析与修复
1. Fist类缺少__repr__方法
直接打印列表时,Python会调用列表内每个元素的__repr__方法,而非__str__。你只重写了__str__,所以列表打印仍显示对象地址。需要给Fist类添加__repr__方法,或者让__repr__复用__str__的逻辑。
2. Player类__str__方法拼写错误
方法内的self.fist应为self.fists(少了末尾的s),否则调用时会抛出AttributeError。
3. Player类check_fist_count方法逻辑错误
判断self.fists == 0是错误的,因为self.fists是列表,应该检查其长度len(self.fists) == 0。
4. Player类__init__方法缩进错误
创建fists的循环缩进不在__init__方法内部,导致代码无法正确初始化玩家的fists属性,还会引发NameError。
修复后的完整代码
class Fist: Labels = ['Left', 'Right'] def __init__(self, label): self.label = label # 重写__str__用于直接打印对象时的输出 def __str__(self): return f"{self.label}" # 重写__repr__,让列表打印时也显示友好内容 def __repr__(self): return self.__str__() class Player: def __init__(self, name): self.name = name self.fists = [] # 初始化玩家的两只拳头,缩进修正到__init__内部 for label in Fist.Labels: self.fists.append(Fist(label)) def check_fist_count(self): # 修正判断逻辑:检查列表长度 if len(self.fists) == 0: print(f'{self.name} fist count is now zero. They now are out of the game!') def __str__(self): # 修正拼写错误:self.fist → self.fists return f"{self.name}: {' '.join([str(fist) for fist in self.fists])}" if __name__ == '__main__': numberOfPlayers = int(input("Bubblegum Nursery Rhyme Game: How many players will be playing this game?")) if numberOfPlayers <= 1 : print('Sorry, you can only play this game if you have a minimum of 2 players.') else: # 只有玩家数合法时才创建玩家 game_players = [] for i in range(numberOfPlayers): game_players.append(Player(f'Player {i+1}')) # 玩家编号从1开始更符合习惯 # 测试打印 for game_player in game_players: print(game_player.fists) # 现在会显示['Left', 'Right'] print(game_player) # 使用Player的__str__方法打印
修复后的输出示例
[Left, Right] Player 1: Left Right [Left, Right] Player 2: Left Right
内容的提问来源于stack exchange,提问作者zee
相关产品推荐
相关产品推荐

