我有一个类,比方说,它计算一个人的保险风险,并且在计算过程中计算了一些其他变量。稍后我需要访问风险和其他变量。
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).risk
或 InsuranceRiskModel(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/