2011-06-23 5 views
3

私は、人の保険リスクを計算し、計算中にいくつかの他の変数が計算されるクラスを持っています。私はリスクと他の変数に後でアクセスする必要があります。私はいくつかの他の機能では今"派生フィールド"/"計算からのクラス属性"のPythonパラダイム

class InsuranceRiskModel: 

    self.risk = None 
    self.other_var = None 
    ... 

    def get_risk(): 
     # do a bunch of calculations, 
     # which in the meantime fills out a bunch of other vars 
     self.other_var = 5 
     self.risk = 6 
     return self.risk 

    def get_other_var(): 
     # risk hasn't been calculated 
     if not self.risk: 
      raise NotYetCalculatedError("Not yet calculated!") 
     return self.other_var 

r = InsuranceRiskModel(person) 
risk = r.get_risk() 
other_var = r.get_other_var() 

これは私がしたいプログラムの並べ替えのための合法的な構造ですか?ちょうど計算の例外をスローすると、偽の値を得るのを防ぐために実行されていませんか?

答えて

5

いいえ、どんなプログラムでも計算をNotYetCalculatedErrorすることは正当なものではありません(計算に数時間かかることがない限り)。

get_other_var()自動的リスクあなたがクラスを初期化する、またはあなたがそれを行うことができない場合、あなたはこれをしたいだろうと何あなたが実際にやりたいことは実行すべての計算である

を計算する必要があります:

class InsuranceRiskModel(object): 
    def __init__(self, person): 
     self.person = person 
     self.calculated = False 

    def calculateModel(self): 
     if not self.calculated: 
      self.risk = 6 
      self.other_var = 5 
      self.calculated = True 

    @property 
    def risk(self): 
     self.calculateModel() 
     return self.risk 

    @property 
    def other_var(self): 
     self.calculateModel() 
     return self.other_var 

次に、あなたは​​3210やInsuranceRiskModel(bob).other_varいつでもアクセスでき、計算は透過的に行われます。

あなたのより一般的な質問に答えるために、上記で示したように、透明なユーザー定義のゲッターとセッターと削除者を含むクラスプロパティの抽象化は、「格納された計算によって表されるクラス属性のためのpythonパラダイム」です。ここでは詳細http://docs.python.org/library/functions.html#property

+1

Wordこれははるかに理にかなっています。レッスンありがとう! – ash

1

なぜ:

def get_other_var(): 
    # risk hasn't been calculated 
    if not self.risk: 
     self.risk = self.get_risk() 
    return self.other_var 

これはPython固有のものではありません。あなたのクラスのユーザーがother_varを必要としていて、それ以前にriskを計算する必要がある場合は、それを静かに計算する方が良いでしょう。

関連する問題