You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 14:25:18