"derived fields"/"class attributes from calculations"的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()

这是我想要的那种程序的合法结构吗?只是抛出一个计算尚未运行的异常,以防止得到伪值?

不,在任何程序中都不能提出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).riskInsuranceRiskModel(bob).other_var,计算将透明地完成。

为了回答您更普遍的问题,"存储计算表示的类属性的python范式"是类属性抽象,涉及透明的用户定义getter、setter和deleter,如上所示;此处提供更多信息http://docs.python.org/library/functions.html#property

为什么不:

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,那么最好只进行静默计算。

相关内容

  • 没有找到相关文章

最新更新