Я пытаюсь получить доступ к атрибуту, который не должен быть создан в методе __init__
моего класса, но может быть рассчитан путем вызова другого метода. Я пытаюсь сделать так, чтобы, если я попытаюсь получить доступ к атрибуту, и он не существует, он будет автоматически рассчитан. Тем не менее, я не хочу, чтобы он был пересчитан, если атрибут существует, даже если значение будет отличаться. Например:
class SampleObject(object):
def __init__(self, a, b):
self.a = a
self.b = b
def calculate_total(self):
self.total = self.a + self.b
sample = SampleObject(1, 2)
print sample.total # should print 3
sample.a = 2
print sample.total # should print 3
sample.calculate_total()
print sample.total # should print 4
Мое лучшее решение до сих пор заключается в создании метода get_total(), который делает то, что мне нужно.
class SampleObject2(object):
def __init__(self, a, b):
self.a = a
self.b = b
def calculate_total(self):
self.total = self.a + self.b
def get_total(self):
if hasattr(self, 'total'):
return self.total
else:
self.calculate_total()
return self.total
sample2 = SampleObject2(1, 2)
print sample2.get_total() # prints 3
sample2.a = 2
print sample2.get_total() # prints 3
sample2.calculate_total()
print sample2.get_total() # prints 4
Это прекрасно работает, но я прочитал, что использование getters в python не рекомендуется, и я надеялся избежать вызова этой функции каждый раз, когда захочу получить доступ к этому атрибуту. Это мое лучшее решение, или есть более чистый, более питонический способ сделать это?
Это пример, который я составил. В моей фактической проблеме calculate_total() - это процесс, требующий много времени, который необязательно должен быть вызван. Поэтому я не хочу выполнять его в методе init.