Python自定义类对象列表:如何获取属性值及优化打印显示
问题描述
我编写了如下Python代码:
class BallPlayer: def __init__(self,name:str,number:int,goals:int,assists:int,minutes:int): self.minutes = minutes self.assists = assists self.goals = goals self.number = number self.name = name def most_goals(a:list): newList=sorted(a, key=lambda item:item.goals,reverse=True) return newList
if __name__ == "__main__": player1 = BallPlayer("Archie Bonkers", 13, 5, 12, 46) player2 = BallPlayer("Speedy Tickets", 7, 2, 26, 55) player3 = BallPlayer("Cruella De Hill", 9, 1, 32, 26) player4 = BallPlayer("Devilled Tasmanian", 12, 1, 11, 41) player5 = BallPlayer("Donald Quack", 4, 3, 9, 12) team = [player1, player2, player3, player4, player5] print(most_goals(team))
我创建了BallPlayer类并实例化多个对象存入列表,期望most_goals函数返回进球最多的球员名字。但调用函数后打印返回的列表时,显示的是对象的内存地址:[<__main__.BallPlayer object at 0x000001D6FA4833C8>, ...];同时尝试通过newList[0].name获取进球最多的球员名字,却无法得到有效数值。请问如何像操作普通列表一样获取该对象列表中的属性值?
解决方案
1. 让对象打印时显示友好信息
Python默认打印对象会输出内存地址,只需在BallPlayer类中重写__str__和__repr__方法,自定义显示内容:
class BallPlayer: def __init__(self,name:str,number:int,goals:int,assists:int,minutes:int): self.minutes = minutes self.assists = assists self.goals = goals self.number = number self.name = name # 用于print()单个对象时的友好显示 def __str__(self): return f"球员: {self.name}, 号码: {self.number}, 进球数: {self.goals}" # 用于列表打印时的友好显示 def __repr__(self): return self.__str__()
修改后再打印排序后的列表,就能看到每个球员的具体信息,而非内存地址。
2. 修正most_goals函数以匹配需求
你期望函数返回进球最多的球员名字,但当前函数返回的是完整排序列表。可以修改函数直接返回目标值:
def most_goals(a:list): # 按进球数降序排序后取第一个元素的名字 top_player = sorted(a, key=lambda item: item.goals, reverse=True)[0] return top_player.name
调用后直接打印结果即可得到目标名字:
print(most_goals(team)) # 输出: Archie Bonkers
如果需要保留排序后的球员列表,调用后通过索引访问属性即可:
sorted_players = most_goals(team) print(sorted_players[0].name) # 输出: Archie Bonkers
你之前无法获取有效数值,大概率是没有正确将函数返回值赋值给变量后再访问属性,或是直接打印整个列表导致误解。
3. 批量获取对象列表的属性值
如果要像操作普通列表一样批量提取属性,用列表推导式即可:
# 获取所有球员的名字列表 all_names = [player.name for player in team] print(all_names) # 输出: ['Archie Bonkers', 'Speedy Tickets', 'Cruella De Hill', 'Devilled Tasmanian', 'Donald Quack'] # 获取排序后所有球员的进球数 sorted_goals = [p.goals for p in sorted(team, key=lambda x: x.goals, reverse=True)] print(sorted_goals) # 输出: [5, 3, 2, 1, 1]
内容的提问来源于stack exchange,提问作者Donito Nunzia
相关产品推荐
相关产品推荐

