2017-07-05 4 views
0

Hallo Ich möchte eine Klasse mit mehreren Methoden erstellen. Jede Methode hängt vom Ergebnis einer anderen Methode ab. Ein vereinfachtes Beispiel wie folgt aussieht:Beste Klassenstruktur für Schritt für Schritt Objekt Manipulation in Python

class klass(object): 
def __init__(self, x, y): 
    self.x = x 
    self.y = y 
    self.results = 0 

def method1(self): 
    self.results = self.x + self.y 
    return self.results 

def method2(self): 
    self.results = math.sqrt(self.results) 
    return self.results 

method2 sollte erst nach method1 genannt. das heißt:

>>> b=klass(3.0, 4.0) 
>>> b.method1() 
7.0 
>>> b.method2() 
2.6457513110645907 

Die Idee ist, dass jemand method1 und jemand nur das Ergebnis müssen sonst das Ergebnis der method2 auch benötigen. Also muss die erste Person nur Methode1 ausführen und die zweite Person muss Methode1 und dann Methode2 ausführen.

Was ist die beste (lesbarste und einfachste) Möglichkeit, das zu tun.

Beachten Sie, dass dies ist eine viel einfachere Version einer komplexen Klasse

Antwort

0

mich korrigieren, wenn ich das falsch bekommen, konnte aber nicht einfach method1 in method2 wie folgt aufrufen:

def method2(self): 
    self.method1() 
    self.results = math.sqrt(self.results) 
    return self.results 
+0

Ja das stimmt. Aber das wird meinen Code verlangsamen. d. h. in Fällen, in denen jemand Methode1 benötigt und nach einiger Zeit auch Methode2 benötigt, ist es besser, Methode1 nicht erneut auszuführen (da sie bereits berechnet und gespeichert wurde). – MaPy

+0

Aber das ist nur eine schnelle Überprüfung mit einer booleschen Variable, die Sie gesetzt haben, als Methode1 ausgeführt wurde, oder? – Flomp

1

Ich würde Ergebnisse zu einem Wörterbuch wechseln und die Ergebnisse für jede Ebene separat speichern. Dann können Sie jede Methode if "level1" not in self.results: raise an exception einchecken, aber dann können Sie die Ausgabe jeder Ebene für Benutzer bereitstellen. Außerdem könnten Sie jede Methode starten, indem Sie prüfen, ob die Ergebnisse bereits existieren. Ein Beispiel wäre wie folgt:

class klass(object): 
def __init__(self, x, y): 
    self.x = x 
    self.y = y 
    self.results = {"level0": 0} 

def method1(self): 
    if "level1" not in self.results: 
     self.results["level1"] = self.x + self.y 
    return self.results["level1"] 

def method2(self): 
    if "level1" not in self.results: 
     raise ValueError("The results of method1 are not yet available") 
    if "level2" not in self.results: 
     self.results["level2"] = math.sqrt(self.results["level1"]) 
    return self.results["level2"] 

P.S. Sie nicht den Namen klass

0

können Sie verschiedene Funktionen zu Aggregatfunktionen schreiben Sie an einem einzigen Ort benötigen:

class klass(object): 

    def __init__(self, x, y): 
     self.x = x 
     self.y = y 
     self.results = 0 

    def method1(self): 
     self.results = self.x + self.y 
     return self.results 

    def method2(self): 
     self.results = math.sqrt(self.results) 
     return self.results 

    def both_methods(self): 
     self.method1() 
     self.method2() 
     return self.results