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)
关键修正说明
- Player类的字符串表示:通过
__str__和__repr__方法定义了球员的友好输出格式,解决内存地址显示问题。 - 总评分计算:使用生成器表达式累加所有球员的评分,再除以球员数量,同时处理了空球员列表的异常情况。
- 父类初始化修正:将
Franchise.__init__的最后一个参数改为正确的rivals,同时用super()替代直接调用父类构造方法,提升代码可维护性。 - getTeam方法优化:加入
overall属性的返回,与注释中定义的Team属性列表匹配。
内容的提问来源于stack exchange,提问作者Remi
相关产品推荐
相关产品推荐

