Парадигма Python для «производных полей» / «атрибутов класса из вычислений» - PullRequest
4 голосов
/ 23 июня 2011

У меня есть класс, который, скажем, вычисляет страховой риск человека, и несколько других переменных вычисляются во время вычисления.Мне понадобится доступ к риску и другим переменным позже.

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

Является ли это законной структурой для программы I типа?хочу?Просто сгенерировать исключение из вычислений, которые не были выполнены, чтобы предотвратить получение поддельных значений?

Ответы [ 2 ]

6 голосов
/ 23 июня 2011

Нет, не разрешено поднимать 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 для [атрибутов класса, представленных] хранимыми вычислениями» - это абстракция свойства класса, включающая прозрачные определяемые пользователем методы получения и установки и удаления, как показано выше; больше информации здесь http://docs.python.org/library/functions.html#property

1 голос
/ 23 июня 2011

Почему бы и нет:

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 необходимо вычислить до него, лучше просто вычислить это молча.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...