2016-07-14 9 views
-1

Ich habe eine Klasse und eine Funktion, die Instanzen dieser Klasse zu aktualisieren versucht und zurück:Python3.5 Funktion, die Objekt-Methode ruft gibt keine statt Objekt

class Foo: 
    def __init__(self): 
     self.datum = 'a' 
    def update(self): 
     self.datum = 'b' if self.datum == 'a' else 'a' 

def updater(foo_obj): 
    return(foo_obj.update()) 

aber updater() kehrt None s Aufruf und nicht die Instanzen der Klasse Foo. Warum ist das? Was kann ich ändern, um das gewünschte Ergebnis zu erhalten?

type(updater(Foo())) #NoneType 
+3

Sie geben nichts von 'Foo.update' zurück. –

+0

Siehe meinen Kommentar unten auf Dipaks Antwort – Taylor

Antwort

1

Aktualisierung Updater aktualisieren.

def updater(foo_obj): 
    foo_obj.update() 
    return(foo_obj) 

OR return self von Klassenfunktion:

def update(self): 
     self.datum = 'b' if self.datum == 'a' else 'a' 
     return self 
+0

Der erste ist, was ich wollte. Warum verändert die Aufteilung in zwei Zeilen den Effekt vollständig? – Taylor

+1

@ Taylor Da Sie dann das Objekt selbst zurückgeben, nicht den Rückgabewert von '.update()', die 'None' ist. –

+0

Ja, macht Sinn. Ich fühle mich dumm, dass ich davor nicht schon einmal darauf gestoßen bin. – Taylor

1

Ihre update Methode gibt nichts, was in Python bedeutet, dass es None implizit zurückgibt. Wenn Sie möchten, dass es einen aussagekräftigen Rückgabewert hat, müssen Sie dies explizit tun. Zum Beispiel:

def update(self): 
    self.datum = 'b' if self.datum == 'a' else 'a' 
    return self.datum 
0

Wenn Sie update mögen Instanzen der Foo Klasse zurückzukehren, müssen Sie dies explizit so mit einer return-Anweisung zu tun haben, sonst wird es implizit gibt None zurück (dh es ist eine Void-Methode, obwohl Python diese Begriffe nicht verwendet, weil Duck-Typing). Tun Sie dies wie folgt:

def update(self): 
    self.datum = 'b' if self.datum == 'a' else 'a' 
    return self 

Sie können auch senden Sie das Foo Objekt in updater, wenn Sie nicht möchten, dass Ihre Klasse, es zu tun, etwa so:

def updater(foo_obj): 
    foo_obj.update() 
    return foo_obj 

Wenn Sie möchten zurückkehren nur self.datum und nicht das ganze Objekt, dann tun, das wie:

def update(self): 
    self.datum = 'b' if self.datum == 'a' else 'a' 
    return self.datum 

oder ähnlich:

def updater(foo_obj): 
    foo_obj.update() 
    return foo_obj.datum