我有一个类,比方说,它计算一个人的保险风险,并且在计算过程中计算一些其他变量。我稍后需要访问风险和其他变量。
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和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
,那么最好只进行静默计算。