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)
这是我想要的那种程序的合法结构吗?只是抛出一个尚未运行的计算异常,以防止获取虚假值?
不,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).risk
或InsuranceRiskModel(bob).other_var
随时访问,计算将以透明方式完成.
为了回答你更普遍的问题,"存储计算所代表的[类属性的python范例"是类属性抽象,涉及透明的用户定义的getter和setter和deleters,如上所示; 更多信息,请访问http://docs.python.org/library/functions.html#property
归档时间: |
|
查看次数: |
544 次 |
最近记录: |