2013-10-03 38 views
0

我有一個類來表示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

解決您可能有'get_avg()'作爲參數接受您要平均超過所有'qb'實例的列表,或者你可以維護該列表作爲像@yan提到的那樣,它是一個類變量並附加到'__init__'中。 –

回答

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)