2011-06-23 20 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

單詞,這更有意義。感謝您的教訓! – 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,則最好只是默默計算。