【问题标题】:Python paradigm for "derived fields"/"class attributes from calculations"“派生字段”/“计算中的类属性”的 Python 范例
【发布时间】:2011-06-23 08:02:33
【问题描述】:

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

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()

对于我想要的那种程序来说,这是一个合法的结构吗?只是抛出计算没有运行的异常,防止得到假值?

【问题讨论】:

    标签: python oop attributes properties class-attributes


    【解决方案1】:

    不,在任何程序中提出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以及deleter,如上所示;更多信息在这里http://docs.python.org/library/functions.html#property

    【讨论】:

    • Word,这更有意义。谢谢你的课!
    【解决方案2】:

    为什么不:

    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之前计算,最好默默计算。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-06
      • 2020-03-28
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 2013-05-16
      • 2018-03-21
      • 1970-01-01
      相关资源
      最近更新 更多