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

Python球队球员关联问题:如何计算总评分并正确显示球员信息

问题分析与修正方案

核心错误点

  • Player对象显示内存地址:Python默认用内存地址作为对象的字符串表示,需给Player类定义自定义输出方法。
  • 球队总评分计算错误:原代码仅取第二个球员的POvr值计算,正确逻辑是累加所有球员的POvr后除以球员总数。
  • 父类初始化参数错误:Team类调用Franchise.__init__时,误将currentplayers作为rivals参数传入,导致父类属性赋值错误。
  • 冗余与缺失代码:Team的__init__重复赋值self.currentplayers,且getTeam方法未返回overall属性(与注释中的属性列表不符)。

修正后的代码

class Player:
    totalPlayers = 0
    def __init__(self, PName, PYearBorn, POvr, PNumber, PIndex):
        self.PName = PName
        self.PYearBorn = PYearBorn
        self.POvr = POvr
        self.PNumber = PNumber
        self.PIndex = PIndex
        Player.totalPlayers += 1

    def getPlayer(self):
        return self.PName, self.PYearBorn, self.POvr, self.PNumber, self.PIndex

    # 自定义对象字符串输出格式,打印时显示球员具体信息
    def __str__(self):
        return f"Player(Name: {self.PName}, Born: {self.PYearBorn}, Ovr: {self.POvr}, Number: {self.PNumber}, Index: {self.PIndex})"

    # 确保在容器中打印时也显示正确信息
    def __repr__(self):
        return self.__str__()

class HistoricPlayer(Player):
    def __init__(self, PName, PlayerAge, POvr, PNumber, PIndex):
        self.PlayerAge = PlayerAge
        super().__init__(PName, PlayerAge, POvr, PNumber, PIndex)

class Franchise:
    totalFranchises = 0
    def __init__(self, FName, region, championships, yearCreated, rivals):
        self.FName = FName
        self.region = region
        self.championships = championships
        self.yearCreated = yearCreated
        self.rivals = rivals
        Franchise.totalFranchises += 1

class Team(Franchise):
    totalTeams = 0
    def __init__(self, TName, FName, amountofplayers, maxplayercapacity, region, championships, yearCreated, rivals, currentplayers):
        # 修正父类初始化参数,传入正确的rivals
        super().__init__(FName, region, championships, yearCreated, rivals)
        self.TName = TName
        self.amountofplayers = amountofplayers
        self.maxplayercapacity = maxplayercapacity
        self.currentplayers = currentplayers
        # 修正总评分计算:累加所有球员POvr后除以数量,处理空列表边界情况
        total_ovr = sum(player.POvr for player in currentplayers)
        self.overall = total_ovr / len(currentplayers) if currentplayers else 0
        Team.totalTeams += 1

    def getTeam(self):
        # 添加overall属性返回,与注释定义的属性列表保持一致
        return (self.TName, self.FName, self.overall, self.amountofplayers,
                self.maxplayercapacity, self.region, self.championships,
                self.yearCreated, self.rivals, self.currentplayers)

# 测试代码
P01 = Player('Francis', 2000, 8, 69, 'p01')
P02 = Player('Franton', 2000, 8, 69, 'p02')
P03 = Player('Frank', 2000, 8, 69, 'p03')
P04 = Player('Felitio', 2000, 8, 69, 'p04')
P05 = Player('Fred', 2000, 8, 69, 'p05')
T01 = Team('5 Friends', "The friends' club", 5, 6, "Hometown", 0, 2022, 'Rich', (P01, P02, P03, P04, P05))

# 打印球队信息,此时Player对象会显示具体内容
for item in T01.getTeam():
    print(item)

关键修正说明

  1. Player类的字符串表示:通过__str__和__repr__方法定义了球员的友好输出格式,解决内存地址显示问题。
  2. 总评分计算:使用生成器表达式累加所有球员的评分,再除以球员数量,同时处理了空球员列表的异常情况。
  3. 父类初始化修正:将Franchise.__init__的最后一个参数改为正确的rivals,同时用super()替代直接调用父类构造方法,提升代码可维护性。
  4. getTeam方法优化:加入overall属性的返回,与注释中定义的Team属性列表匹配。

内容的提问来源于stack exchange,提问作者Remi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:01:04