"衍生字段"/"来自计算的类属性"的Python范例

atp*_*atp 4 python oop attributes properties class-attributes

我有一个课程,比方说,计算一个人的保险风险,并在计算过程中计算一些其他变量.我稍后需要访问风险和其他变量.

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
Run Code Online (Sandbox Code Playgroud)

现在我做的其他一些功能:

r = InsuranceRiskModel(person)
risk = r.get_risk()
other_var = r.get_other_var()
Run Code Online (Sandbox Code Playgroud)

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

nin*_*cko 6

不,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
Run Code Online (Sandbox Code Playgroud)

然后您可以访问InsuranceRiskModel(bob).riskInsuranceRiskModel(bob).other_var随时访问,计算将以透明方式完成.

为了回答你更普遍的问题,"存储计算所代表的[类属性的python范例"是类属性抽象,涉及透明的用户定义的getter和setter和deleters,如上所示; 更多信息,请访问http://docs.python.org/library/functions.html#property