In einem Open-Source-Projekt bin ich auf so etwas gestoßen. Methoden, die Instanzattribute ändern, geben einen Verweis auf die Instanz zurück. Was ist der Zweck dieses Konstrukts?
class Foo(object):
def __init__(self):
self.myattr = 0
def bar(self):
self.myattr += 1
return self
python
method-chaining
nate c
quelle
quelle
Antworten:
Es soll das Verketten erlauben.
Zum Beispiel:
Nun können Sie sagen:
quelle
Wie @Lie Ryan und @Frank Shearar erwähnen, nennt man das eine "fließende Schnittstelle", aber dieses Muster gibt es schon sehr lange.
Der umstrittene Teil dieses Musters ist, dass Sie in OO einen veränderlichen Zustand haben. Eine Void-Methode hat also eine Art impliziten Rückgabewert von
this
- das Objekt mit dem aktualisierten Zustand ist also eine Art Rückgabewert.In einer OO-Sprache mit veränderlichem Zustand sind diese beiden also mehr oder weniger gleichwertig:
...im Gegensatz zu
Daher habe ich in der Vergangenheit gehört, dass Menschen sich fließenden Schnittstellen widersetzen, weil sie die erste Form mögen. Ein anderer Name, den ich für "fließendes Interface" gehört habe, ist "Zugunglück";)
Ich sage jedoch "mehr oder weniger gleichwertig", weil fließende Schnittstellen eine Falte hinzufügen. Sie müssen dies nicht "zurückgeben". Sie können "neu zurückkehren". Dies ist eine Möglichkeit, in OO unveränderliche Objekte zu erhalten.
Sie könnten also eine Klasse A haben, die dies tut (Pseudocode)
Jetzt gibt jede Methode ein brandneues Objekt zurück, wobei das ursprüngliche Objekt unverändert bleibt. Und das ist eine Möglichkeit, in unveränderliche Objekte zu gelangen, ohne wirklich viel an Ihrem Code zu ändern.
quelle
new(...)
, würde das Speicher verlieren.__init__
wiederholtes Aufrufen wird auch der Overhead erhöht.Die meisten Sprachen kennen das "return self" -Idiom und ignorieren es, wenn es nicht in einer Zeile verwendet wird. Es ist jedoch bemerkenswert, dass in Python Funktionen
None
standardmäßig zurückgegeben werden.Als ich in der CS-Schule war, machte mein Ausbilder eine große Sache über den Unterschied zwischen Funktionen, Prozeduren, Routinen und Methoden. Viele handverkrampfte Essayfragen wurden mit Druckbleistiften herausgeschliffen, die mir bei all dem heiß wurden.
Es genügt zu sagen, dass die Rückkehr zu sich selbst der endgültige Weg ist, Klassenmethoden zu erstellen, aber Python erlaubt mehrere Rückgabewerte, Tupel, Listen, Objekte, Primitive oder Keine.
Verkettung bedeutet lediglich, die Antwort auf die letzte Operation in die nächste zu verschieben, und die Laufzeit von Python kann so etwas optimieren. Listenverständnisse sind eine eingebaute Form davon. (Sehr kraftvoll!)
Daher ist es in Python nicht so wichtig, dass jede Methode oder Funktion Dinge zurückgibt, weshalb der Standardwert None ist.
Es besteht die Meinung, dass jede Aktion in einem Programm ihren Erfolg, ihr Scheitern oder ihr Ergebnis an den aufrufenden Kontext oder das aufrufende Objekt zurückmelden sollte, aber hier nicht über die DOD-ADA-Anforderungen gesprochen hat. Wenn Sie Feedback von einer Methode benötigen, gehen Sie vor oder nicht, aber versuchen Sie, diesbezüglich konsistent zu sein.
Wenn eine Methode fehlschlagen kann, sollte sie Erfolg oder Misserfolg zurückgeben oder eine zu behandelnde Ausnahme auslösen.
Eine Einschränkung ist, dass Sie mit Python alle Ihre Methoden Variablen zuweisen können, wenn Sie die Rückgabeselbstbezeichnung verwenden, und Sie möglicherweise glauben, dass Sie ein Datenergebnis oder eine Liste erhalten, wenn Sie das Objekt tatsächlich erhalten.
Typbeschränkende Sprachen schreien und schreien und brechen, wenn Sie dies versuchen, aber interpretierte Sprachen (Python, Lua, Lisp) sind viel dynamischer.
quelle
In Smalltalk hat jede Methode, die nicht explizit etwas zurückgibt, ein implizites "return self".
Dies liegt daran, dass (a) jede Methode etwas zurückgibt, was das Rechenmodell einheitlicher macht, und (b) es sehr nützlich ist, wenn Methoden sich selbst zurückgeben. Josh K gibt ein schönes Beispiel.
quelle
Python
, jede Methode, die nicht explizit etwas zurückgibt, hat eine implizite "return None".Vorteile der Rückgabe eines Objekts (
return self
)Beispiel:
Populärer Stil in der Programmiergemeinschaft (glaube ich).
Vorteile der Mutation eines Objekts (nein
return self
)return
für andere Zwecke.quelle