Calcular atributo si no existe

Estoy intentando acceder a un atributo que no debería crearse en el__init__ método de mi clase, pero se puede calcular llamando a otro método. Estoy tratando de hacerlo para que si intento acceder al atributo y no existe, se calculará automáticamente. Sin embargo, no quiero que se vuelva a calcular si el atributo existe, incluso si el valor fuera diferente. Por ejemplo:

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

Mi mejor solución hasta ahora es crear un método get_total () que haga lo que necesito.

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

Esto funciona bien, pero he leído que no se recomienda usar getters en python y esperaba evitar llamar a esta función cada vez que quería acceder al atributo. ¿Es esta mi mejor solución, o hay una forma más limpia y más pitónica de hacerlo?

Este es un ejemplo que inventé. En mi problema real, Calculate_total () es un proceso lento que no necesariamente será necesario llamar. Así que no quiero ejecutarlo en elen eso método.

Respuestas a la pregunta(2)

Su respuesta a la pregunta