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

不,在任何程序中提出NotYetCalculatedError永远都是不合法的(除非计算需要花费数小时的工作)。

get_other_var()应该自动计算风险

您真正想要做的是在初始化 class 时运行所有计算,或者如果您不能这样做,您需要这样做:

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).riskInsuranceRiskModel(bob).other_var并且计算将透明地完成。

为了回答您更一般的问题,“[类属性表示的]存储计算的python范例”是类属性抽象,涉及透明的用户定义的getter和setter以及deleter,如上所示;更多信息在这里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 回答