2016-04-15 15 views
1

ホームチーム、離れたチーム、そしてゲームの結果を入れることができるプログラムを書いています。私はチームのデータをこれに応じて変更するようにしたいと思います。しかし、私は "ポイント"、 "ゴール差"、 "プレー"(ゲーム)を変更することはできません! 他の属性の値で計算される属性の作成

class team: 
    def __init__(self, name, wins, drawn, losses, goals_for, goals_against): 
     self.name = name 
     self.wins = int(wins) 
     self.drawn = int(drawn) 
     self.losses = int(losses) 
     self.goals_for = int(goals_for) 
     self.goals_against = int(goals_against) 
     self.goals_difference = (self.goals_for - self.goals_against) 
     self.points = ((self.wins * 3) + self.drawn) 
     self.played = (self.wins + self.drawn + self.losses) 
    def __repr__(self): 
     return 'Name:{} P:{} W:{} D:{} L:{} GF:{} GA:{} GD:{} PTS:{}'.format(self.name, self.played, self.wins, self.drawn, self.losses, self.goals_for, self.goals_against, self.goals_difference, self.points)  

detroit_red_wings = team("Detroit", 1, 0, 3, 4, 5) 
los_angeles_kings = team("LA", 0, 1, 4, 3, 7) 
toronto_maple_leafs = team("Toronto", 1, 2, 2, 3, 6) 

teamlist = [detroit_red_wings, los_angeles_kings, toronto_maple_leafs] 
print(teamlist) 

class data_input: 
    def home_team_input(self): 
     home_team = input("Type in the home team: ") 
     for i in teamlist: 
      if i.name == home_team: 
       return i 
    def away_team_input(self):   
     away_team = input("Type in the away team: ") 
     for t in teamlist: 
      if t.name == away_team: 
       return t 
    def result_input(self): 
     goals_home_team = int(input("Type in the number of goals made by the home team: ")) 
     goals_away_team = int(input("Type in the number of goals made by the away team: ")) 
     return (goals_home_team, goals_away_team) 

def adding_result(): 
    home_team = data_input.home_team_input() 
    away_team = data_input.away_team_input() 
    goals_home_team, goals_away_team = data_input.result_input() 

    home_team.goals_for += goals_home_team 
    home_team.goals_against += goals_away_team 
    away_team.goals_for += goals_away_team 
    away_team.goals_against += goals_home_team 

    if goals_home_team > goals_away_team: 
     home_team.wins += 1 
     away_team.losses += 1 
    if goals_home_team < goals_away_team: 
     away_team.wins += 1 
     home_team.losses += 1 
    if goals_home_team == goals_away_team: 
     home_team.drawn += 1 
     away_team.drawn += 1 

data_input = data_input() 
adding_result() 
print(teamlist) 

は、私はクラス team__init__方法で属性の指示を書いて、あなたがポイントを見ることができるよう winsに依存します。これは私がこれまでに書いたコードです。これはすべてオブジェクトを作成するときに機能しますが、新しいゲームの結果を入れたとき pointsは変更されません( playedまたは goals_differenceは変更されません)。これは、私がゲームの結果を input関数で打ち込むと、他の属性が変わるので私を驚かせます。あなたの __init__方法は再びあなたが他のプロパティを更新した後に実行されていないため、

答えて

0

pointsgoals_difference、およびplayedは更新されません - あなたは、単に彼らの新しい値で明示的に他のプロパティを更新しています。更新されないこれらのプロパティは、によって割り当てられ、参照ではなく、明示的に指定しない限り、これらのプロパティを更新する必要があることをオブジェクトが知る方法はありません。

単純なオプションは、他のプロパティを明示的に変更した後に呼び出すことができる集約プロパティを更新するメソッドを提供することです。私は単に他のプロパティの数学的定式化であるすべてのプロパティを取るので(pointsgoals_difference、およびplayed)、それらを初期化メソッドから削除します。代わりに、あなたは本当にこの

def update_aggregates(self): 
    self.goals_difference = (self.goals_for - self.goals_against) 
    self.points = ((self.wins * 3) + self.drawn) 
    self.played = (self.wins + self.drawn + self.losses) 

編集のようになります。これらのプロパティを必要とする場合update_aggregatesのような小さなメソッドを呼び出します。シンプルで私の試みを無視して、スティーブ・コーエンによって提案された解決策は、すべてが良いことでは - @propertyを使用すると、手動呼び出しを必要とせずに常に値が適切に更新されます。

+0

これはうまくいった!どうもありがとうございます!! –

+0

個別の更新機能を持つことはひどいことです。計算された結果は@propertiesまたは関数を介してアクセスされ、他のアイテムの現在の状態に対して常に正確になるようにする必要があります。 –

+0

@SteveCohen良い点、私は現時点で私の答えを更新することはできませんが、私は急いで、私はシンプルにしようとしていたが、この場合シンプルさはちょうど悪い習慣です。 – miradulo

3

teamクラスを更新して計算フィールドのプロパティを作成すると、プロパティ関数は常に正しい結果を返します。これらのプロパティを設定しようとすると、設定できない、つまり他の設定データの計算結果であるため、エラーが発生します。

class team: 
    def __init__(self, name, wins, drawn, losses, goals_for, goals_against): 
     self.name = name 
     self.wins = int(wins) 
     self.drawn = int(drawn) 
     self.losses = int(losses) 
     self.goals_for = int(goals_for) 
     self.goals_against = int(goals_against) 

    @property 
    def goals_difference(self): 
     return self.goals_for - self.goals_against 

    @property 
    def points(self): 
     return self.wins * 3 + self.drawn 

    @property 
    def played(self): 
     return self.wins + self.drawn + self.losses 

    def __repr__(self): 
     return 'Name:{} P:{} W:{} D:{} L:{} GF:{} GA:{} GD:{} PTS:{}'.format(
      self.name, self.played, self.wins, self.drawn, self.losses, 
      self.goals_for, self.goals_against, self.goals_difference, 
      self.points) 

Iはまた、かなり初期に5つの変数を渡すよりもW/L/D及びGF/GA初期化子tupplesまたは辞書を作成検討します。

+1

'return'は関数ではありませんので、1つのように見せてください – Eric

+0

C言語の30年の習慣は大いに死んでいます。戻り値の余分な括弧を削除しました。奇妙なことに、PEP8もpylintもこれにフラグを立てていません。 –

+0

これは受け入れられた回答でなければならないことを反映するように私の答えを更新しました-_- – miradulo

関連する問題