Python - 使用类方法

我有一个类来表示NFL四分卫。在每个例子中都会有一个字典列表,其中每个条目都包含关于所玩游戏的QB统计信息。我需要根据我的数据库中的所有四分卫产生平均每场比赛获得的码数。我可以很容易地在面向对象的结构之外做到这一点,只需循环遍历我的实例,构建一个列表等等......但我认为必须有一些优雅的方式来实现这种面向对象的风格。所以我想构建这个函数“get_avg”,我将它传递给我想要的平均变量的名称,如“get_avg('pass_yards')”或“get_avg('pass_attempt')”,它应该返回基于每个实例的平均值以及每种情况下的每个游戏都存在。Python - 使用类方法

class qb: 

def __init__(self, name, espn_player_id):

self.name = name

self.espn_player_id = espn_player_id

self.games=[]

def add_game(self, g):

self.games.append(g)

@classmethod

def get_avg(cls, var):

##create one list based on each game entry in each instance and return average

qb_data = s.query(Box_Score).filter(Box_Score.pass_attempt>8).all()

seen = set()

qbs = [qb(g.player_name, g.espn_player_id) for g in qb_data if g.espn_player_id not in seen and not seen.add(g.espn_player_id)]

for q in qbs:

for g in [qb_game for qb_game in qb_data if qb_game.espn_player_id==q.espn_player_id]:

q.add_game({"date": g.date, "pass_attempt": g.pass_attempt, "pass_made": g.pass_made, "q_team": g.team_name, "opp_team": "",

"pass_yards": g.pass_yards, "pass_td": g.pass_td, "pass_int": g.pass_int, "pass_longest": g.pass_longest})

print qb.get_avg('pass_attempt')

print qb.get_avg('pass_td')

回答:

你想要做两件事情:

  1. 创建一个类变量来包含所有创建的四分卫。 (我们称之为everyone
  2. 然后,在__init__方法中,通过将self附加到该列表中,将每个创建的四分卫添加到该列表中。

然后,当get_avg被调用时,您可以对该列表进行求和。

回答:

这里是燕

提供

class qb: 

all_of_me =[]

def __init__(self, name, espn_player_id):

self.name = name

self.espn_player_id = espn_player_id

self.games=[]

qb.all_of_me.append(self)

def add_game(self, g):

self.games.append(g)

@classmethod

def get_avg(cls, var):

all_stats=[]

for q in cls.all_of_me: all_stats.extend([n[var] for n in q.games])

return np.mean(all_stats)

以上是 Python - 使用类方法 的全部内容, 来源链接: utcz.com/qa/259866.html

回到顶部