"derived fields"/"class attributes from calculations"的 Python 范例

标签 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

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

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 和删除器,如上所示;更多信息在这里http://docs.python.org/library/functions.html#property

关于 "derived fields"/"class attributes from calculations"的 Python 范例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6451034/

相关文章:

c# - NUnit 测试运行顺序

python - 如何在 Python 的同一索引中将数组的每个数字相乘?

python - 仅在正则表达式中捕获重复的组

python - 使用 Python 的 Windows 应用程序

JavaScript 访问父元素

c# - 什么时候分类

ruby - Ruby 中依赖注入(inject)的最佳实践是什么?

jquery 函数在 Safari 中不起作用?

python - 在插入或忽略后获取主键的 ID

html - 模式和类型 ="email"一起使用是否有问题?