Calculate-Attribut, wenn es nicht existiert

Ich versuche auf ein Attribut zuzugreifen, das nicht im @ erstellt werden sol__init__ -Methode meiner Klasse, kann aber durch Aufrufen einer anderen Methode berechnet werden. Ich versuche es so zu machen, dass wenn ich versuche auf das Attribut zuzugreifen und es nicht existiert, es automatisch berechnet wird. Ich möchte jedoch nicht, dass es neu berechnet wird, wenn das Attribut vorhanden ist, auch wenn der Wert unterschiedlich wäre. Beispielsweise

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

Meine bisher beste Lösung besteht darin, eine get_total () -Methode zu erstellen, die das tut, was ich brauche.

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

Dies funktioniert einwandfrei, aber ich habe gelesen, dass die Verwendung von Gettern in Python nicht empfehlenswert ist, und ich hatte die Hoffnung, nicht jedes Mal diese Funktion aufzurufen, wenn ich auf das Attribut zugreifen wollte. Ist das meine beste Lösung, oder gibt es dafür eine sauberere, pythonischere Methode?

Dies ist ein Beispiel, das ich erfunden habe. In meinem eigentlichen Problem ist berechne_Gesamt () ein zeitaufwändiger Prozess, der nicht unbedingt aufgerufen werden muss. Also möchte ich es nicht im @ ausführdri Methode

Antworten auf die Frage(4)

Ihre Antwort auf die Frage