4

たとえば、人の保険リスクを計算するクラスがあり、計算中に他のいくつかの変数が計算されます。後でリスクとその他の変数にアクセスする必要があります。

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()

これは、私が望む種類のプログラムにとって正当な構造ですか? 偽の値を取得するのを防ぐために、計算が実行されていないという例外をスローするだけですか?

4

2 に答える 2

6

いいえ、どのプログラムでも ever を上げることは正当なことではありません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

InsuranceRiskModel(bob).riskその後、またはInsuranceRiskModel(bob).other_varいつでもアクセスでき、計算は透過的に行われます。

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

于 2011-06-23T08:12:14.473 に答える
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

于 2011-06-23T08:12:50.587 に答える