2013-10-03 4 views
0

У меня есть класс для представления защитников НФЛ. В каждом случае будет список словарей, где каждая запись содержит информацию о статистике 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

Вы могли бы иметь 'get_avg)' принимает (в качестве параметра список всех 'qb' случаях требуется усреднение, или вы можете сохранить этот список как переменную класса и добавьте ее в '__init__', как упоминает @yan. –

ответ

2

Вы хотите сделать две вещи:

  1. Создать переменную класса, чтобы содержать все ваши созданные квотербэков. (назовем его everyone)
  2. Затем, в методе __init__, добавьте каждый созданный защитник в этот список, добавив self в этот список.

Тогда вы можете просто суммировать и разделить этот список при вызове get_avg.

0

Вот решение, предоставляемое янь

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) 
Смежные вопросы